@datarecce/ui 0.1.41 → 0.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 (728) hide show
  1. package/README.md +28 -133
  2. package/dist/AuthModal-C8LetZNB.js +23 -0
  3. package/dist/AuthModal-C8LetZNB.js.map +1 -0
  4. package/dist/LineageCanvas-CR38SDYr.d.ts +41 -0
  5. package/dist/LineageCanvas-CR38SDYr.d.ts.map +1 -0
  6. package/dist/ResultErrorFallback-C7c-TN1p.js +3 -0
  7. package/dist/ResultErrorFallback-C7c-TN1p.js.map +1 -0
  8. package/dist/RouteConfigContext-z8YNimdP.d.ts +172 -0
  9. package/dist/RouteConfigContext-z8YNimdP.d.ts.map +1 -0
  10. package/dist/RunProgress-DyFIALbI.d.ts +429 -0
  11. package/dist/RunProgress-DyFIALbI.d.ts.map +1 -0
  12. package/dist/ScreenshotDataGrid-BfxYUThx.d.ts +64 -0
  13. package/dist/ScreenshotDataGrid-BfxYUThx.d.ts.map +1 -0
  14. package/dist/SplitPane-B-BLxZaQ.d.ts +1427 -0
  15. package/dist/SplitPane-B-BLxZaQ.d.ts.map +1 -0
  16. package/dist/advanced.d.ts +18 -0
  17. package/dist/advanced.d.ts.map +1 -0
  18. package/dist/advanced.js +3 -0
  19. package/dist/advanced.js.map +1 -0
  20. package/dist/api-ZZ4cc9b9.d.ts +255 -0
  21. package/dist/api-ZZ4cc9b9.d.ts.map +1 -0
  22. package/dist/api-_i6BZPkM.js +3 -0
  23. package/dist/api-_i6BZPkM.js.map +1 -0
  24. package/dist/api.d.ts +3 -2
  25. package/dist/api.js +2 -100
  26. package/dist/colors--47Kkns4.js +3 -0
  27. package/dist/colors--47Kkns4.js.map +1 -0
  28. package/dist/colors-vY9Yzui0.d.ts +255 -0
  29. package/dist/colors-vY9Yzui0.d.ts.map +1 -0
  30. package/dist/components-run.d.ts +8 -0
  31. package/dist/components-run.js +2 -0
  32. package/dist/components.d.ts +22 -2
  33. package/dist/components.js +2 -86
  34. package/dist/const-DbXBkrxT.js +3 -0
  35. package/dist/const-DbXBkrxT.js.map +1 -0
  36. package/dist/constants-DD5vJv2q.js +3 -0
  37. package/dist/constants-DD5vJv2q.js.map +1 -0
  38. package/dist/constants.d.ts +3 -0
  39. package/dist/constants.js +2 -0
  40. package/dist/contexts.d.ts +7 -0
  41. package/dist/contexts.js +2 -0
  42. package/dist/flag-CiR2E5oz.d.ts +898 -0
  43. package/dist/flag-CiR2E5oz.d.ts.map +1 -0
  44. package/dist/flag-koeDAqr3.js +3 -0
  45. package/dist/flag-koeDAqr3.js.map +1 -0
  46. package/dist/hooks.d.ts +15 -2
  47. package/dist/hooks.js +2 -43
  48. package/dist/index-BFkbe0aF.d.ts +698 -0
  49. package/dist/index-BFkbe0aF.d.ts.map +1 -0
  50. package/dist/index-Ba3hp2Ng.d.ts +471 -0
  51. package/dist/index-Ba3hp2Ng.d.ts.map +1 -0
  52. package/dist/index-C_kD4ZQ3.d.ts +1079 -0
  53. package/dist/index-C_kD4ZQ3.d.ts.map +1 -0
  54. package/dist/index-CiPcALu4.d.ts +146 -0
  55. package/dist/index-CiPcALu4.d.ts.map +1 -0
  56. package/dist/index-CkXLPYZY.d.ts +13 -0
  57. package/dist/index-CkXLPYZY.d.ts.map +1 -0
  58. package/dist/index-DTCpHvX_.d.ts +211 -0
  59. package/dist/index-DTCpHvX_.d.ts.map +1 -0
  60. package/dist/index-DVoQsx5c.d.ts +349 -0
  61. package/dist/index-DVoQsx5c.d.ts.map +1 -0
  62. package/dist/index-DmwYRgDR.d.ts +192 -0
  63. package/dist/index-DmwYRgDR.d.ts.map +1 -0
  64. package/dist/index-N8N7XmRj.d.ts +130 -0
  65. package/dist/index-N8N7XmRj.d.ts.map +1 -0
  66. package/dist/index-h_fw6R9U.d.ts +1501 -0
  67. package/dist/index-h_fw6R9U.d.ts.map +1 -0
  68. package/dist/index-o48TPoFN.d.ts +734 -0
  69. package/dist/index-o48TPoFN.d.ts.map +1 -0
  70. package/dist/index.d.ts +24 -2
  71. package/dist/index.js +2 -198
  72. package/dist/keepAlive-CEzyrDfg.js +3 -0
  73. package/dist/keepAlive-CEzyrDfg.js.map +1 -0
  74. package/dist/lib/api/axiosClient.d.ts +8 -0
  75. package/dist/lib/api/axiosClient.d.ts.map +1 -0
  76. package/dist/lib/api/axiosClient.js +3 -0
  77. package/dist/lib/api/axiosClient.js.map +1 -0
  78. package/dist/lib/api/track.d.ts +137 -0
  79. package/dist/lib/api/track.d.ts.map +1 -0
  80. package/dist/lib/api/track.js +2 -0
  81. package/dist/lib/api/user.d.ts +16 -0
  82. package/dist/lib/api/user.d.ts.map +1 -0
  83. package/dist/lib/api/user.js +2 -0
  84. package/dist/lib/const.d.ts +8 -0
  85. package/dist/lib/const.d.ts.map +1 -0
  86. package/dist/lib/const.js +2 -0
  87. package/dist/lib/result/ResultErrorFallback.d.ts +8 -0
  88. package/dist/lib/result/ResultErrorFallback.d.ts.map +1 -0
  89. package/dist/lib/result/ResultErrorFallback.js +2 -0
  90. package/dist/primitives-CgGUvwHB.d.ts +914 -0
  91. package/dist/primitives-CgGUvwHB.d.ts.map +1 -0
  92. package/dist/primitives.d.ts +12 -0
  93. package/dist/primitives.js +2 -0
  94. package/dist/result.d.ts +4 -0
  95. package/dist/result.js +2 -0
  96. package/dist/src-BgHSbbHk.js +67 -0
  97. package/dist/src-BgHSbbHk.js.map +1 -0
  98. package/dist/styles.css +478 -4
  99. package/dist/theme-CeWzymUn.js +64 -0
  100. package/dist/theme-CeWzymUn.js.map +1 -0
  101. package/dist/theme.d.ts +3 -2
  102. package/dist/theme.js +2 -9
  103. package/dist/track-9ZQpBlUK.js +3 -0
  104. package/dist/track-9ZQpBlUK.js.map +1 -0
  105. package/dist/types-CFbNxrx2.d.ts +171 -0
  106. package/dist/types-CFbNxrx2.d.ts.map +1 -0
  107. package/dist/types-CZre3j02.d.ts +231 -0
  108. package/dist/types-CZre3j02.d.ts.map +1 -0
  109. package/dist/types.d.ts +14 -2
  110. package/dist/types.js +3 -9
  111. package/dist/types.js.map +1 -0
  112. package/dist/useRecceServerFlag-Bg5R67J4.js +3 -0
  113. package/dist/useRecceServerFlag-Bg5R67J4.js.map +1 -0
  114. package/dist/useThemeColors--prVbMmM.js +3 -0
  115. package/dist/useThemeColors--prVbMmM.js.map +1 -0
  116. package/dist/useThemeColors-DHEroo8f.d.ts +104 -0
  117. package/dist/useThemeColors-DHEroo8f.d.ts.map +1 -0
  118. package/dist/user-DMT7E0fc.js +3 -0
  119. package/dist/user-DMT7E0fc.js.map +1 -0
  120. package/dist/utils-CW2skXm_.js +3 -0
  121. package/dist/utils-CW2skXm_.js.map +1 -0
  122. package/dist/utils-CXWhfyxC.js +5 -0
  123. package/dist/utils-CXWhfyxC.js.map +1 -0
  124. package/dist/utils.d.ts +7 -0
  125. package/dist/utils.js +2 -0
  126. package/package.json +115 -107
  127. package/LICENSE +0 -201
  128. package/dist/RecceCheckContext-BJprb2xR.js +0 -7968
  129. package/dist/RecceCheckContext-BJprb2xR.js.map +0 -1
  130. package/dist/RecceCheckContext-DPnWB_aU.css +0 -215
  131. package/dist/RecceCheckContext-DPnWB_aU.css.map +0 -1
  132. package/dist/RecceCheckContext-DbZ7BdRy.mjs +0 -7426
  133. package/dist/RecceCheckContext-DbZ7BdRy.mjs.map +0 -1
  134. package/dist/RecceCheckContext-DyxOeUsX.css +0 -215
  135. package/dist/RecceCheckContext-DyxOeUsX.css.map +0 -1
  136. package/dist/api.d.mts +0 -3
  137. package/dist/api.js.map +0 -1
  138. package/dist/api.mjs +0 -46
  139. package/dist/api.mjs.map +0 -1
  140. package/dist/components-BeAjVBV3.css +0 -70
  141. package/dist/components-BeAjVBV3.css.map +0 -1
  142. package/dist/components-DfXnN1Hx.js +0 -14689
  143. package/dist/components-DfXnN1Hx.js.map +0 -1
  144. package/dist/components-iUxcqtUB.css +0 -70
  145. package/dist/components-iUxcqtUB.css.map +0 -1
  146. package/dist/components-jh6r4tQn.mjs +0 -12348
  147. package/dist/components-jh6r4tQn.mjs.map +0 -1
  148. package/dist/components.d.mts +0 -3
  149. package/dist/components.mjs +0 -9
  150. package/dist/const-CaIm1Z8g.mjs +0 -12
  151. package/dist/const-CaIm1Z8g.mjs.map +0 -1
  152. package/dist/const-CvdZO0FN.js +0 -24
  153. package/dist/const-CvdZO0FN.js.map +0 -1
  154. package/dist/hooks-cQsBXBd1.js +0 -40
  155. package/dist/hooks-cQsBXBd1.js.map +0 -1
  156. package/dist/hooks-eaHm_yEp.mjs +0 -33
  157. package/dist/hooks-eaHm_yEp.mjs.map +0 -1
  158. package/dist/hooks.d.mts +0 -3
  159. package/dist/hooks.mjs +0 -8
  160. package/dist/html2canvas-pro.esm-CsuSOHXp.js +0 -7250
  161. package/dist/html2canvas-pro.esm-CsuSOHXp.js.map +0 -1
  162. package/dist/html2canvas-pro.esm-E7kpobrC.mjs +0 -7249
  163. package/dist/html2canvas-pro.esm-E7kpobrC.mjs.map +0 -1
  164. package/dist/index-B5bpmv0i.d.mts +0 -2172
  165. package/dist/index-B5bpmv0i.d.mts.map +0 -1
  166. package/dist/index-B9lSPJTi.d.ts +0 -2170
  167. package/dist/index-B9lSPJTi.d.ts.map +0 -1
  168. package/dist/index.d.mts +0 -3
  169. package/dist/index.js.map +0 -1
  170. package/dist/index.mjs +0 -20
  171. package/dist/index.mjs.map +0 -1
  172. package/dist/mui-theme-CUhybmBq.mjs +0 -696
  173. package/dist/mui-theme-CUhybmBq.mjs.map +0 -1
  174. package/dist/mui-theme-iBHkjXJq.js +0 -732
  175. package/dist/mui-theme-iBHkjXJq.js.map +0 -1
  176. package/dist/state-CTITyT0R.js +0 -795
  177. package/dist/state-CTITyT0R.js.map +0 -1
  178. package/dist/state-Sc2b4jri.mjs +0 -382
  179. package/dist/state-Sc2b4jri.mjs.map +0 -1
  180. package/dist/theme.d.mts +0 -3
  181. package/dist/theme.mjs +0 -4
  182. package/dist/tooltipMessage-BC5W7H3X.js +0 -13
  183. package/dist/tooltipMessage-BC5W7H3X.js.map +0 -1
  184. package/dist/tooltipMessage-B_xMIKWL.mjs +0 -7
  185. package/dist/tooltipMessage-B_xMIKWL.mjs.map +0 -1
  186. package/dist/types.d.mts +0 -3
  187. package/dist/types.mjs +0 -6
  188. package/dist/urls-BQW5wjg-.js +0 -13
  189. package/dist/urls-BQW5wjg-.js.map +0 -1
  190. package/dist/urls-DT7FVEcS.mjs +0 -7
  191. package/dist/urls-DT7FVEcS.mjs.map +0 -1
  192. package/dist/version-B9s8yne-.js +0 -300
  193. package/dist/version-B9s8yne-.js.map +0 -1
  194. package/dist/version-DP1kU_7v.mjs +0 -162
  195. package/dist/version-DP1kU_7v.mjs.map +0 -1
  196. package/recce-source/.editorconfig +0 -26
  197. package/recce-source/.flake8 +0 -37
  198. package/recce-source/.github/ISSUE_TEMPLATE/bug_report.yml +0 -67
  199. package/recce-source/.github/ISSUE_TEMPLATE/custom.md +0 -10
  200. package/recce-source/.github/ISSUE_TEMPLATE/feature_request.yml +0 -42
  201. package/recce-source/.github/PULL_REQUEST_TEMPLATE.md +0 -21
  202. package/recce-source/.github/copilot-instructions.md +0 -331
  203. package/recce-source/.github/instructions/backend-instructions.md +0 -541
  204. package/recce-source/.github/instructions/frontend-instructions.md +0 -317
  205. package/recce-source/.github/workflows/build-statics.yaml +0 -72
  206. package/recce-source/.github/workflows/bump.yaml +0 -48
  207. package/recce-source/.github/workflows/integration-tests-cloud.yaml +0 -92
  208. package/recce-source/.github/workflows/integration-tests-sqlmesh.yaml +0 -33
  209. package/recce-source/.github/workflows/integration-tests.yaml +0 -52
  210. package/recce-source/.github/workflows/nightly.yaml +0 -246
  211. package/recce-source/.github/workflows/release.yaml +0 -196
  212. package/recce-source/.github/workflows/tests-js.yaml +0 -58
  213. package/recce-source/.github/workflows/tests-python.yaml +0 -128
  214. package/recce-source/.pre-commit-config.yaml +0 -26
  215. package/recce-source/CLAUDE.md +0 -483
  216. package/recce-source/CODE_OF_CONDUCT.md +0 -128
  217. package/recce-source/CONTRIBUTING.md +0 -107
  218. package/recce-source/LICENSE +0 -201
  219. package/recce-source/Makefile +0 -126
  220. package/recce-source/README.md +0 -182
  221. package/recce-source/RECCE_CLOUD.md +0 -81
  222. package/recce-source/SECURITY.md +0 -25
  223. package/recce-source/docs/PACKAGING.md +0 -340
  224. package/recce-source/docs/README.md +0 -1
  225. package/recce-source/docs/plans/2024-12-31-csv-download-design.md +0 -121
  226. package/recce-source/docs/plans/2024-12-31-csv-download-implementation.md +0 -930
  227. package/recce-source/integration_tests/dbt/dbt_project.yml +0 -26
  228. package/recce-source/integration_tests/dbt/models/customers.sql +0 -69
  229. package/recce-source/integration_tests/dbt/models/docs.md +0 -14
  230. package/recce-source/integration_tests/dbt/models/orders.sql +0 -56
  231. package/recce-source/integration_tests/dbt/models/schema.yml +0 -82
  232. package/recce-source/integration_tests/dbt/models/staging/schema.yml +0 -31
  233. package/recce-source/integration_tests/dbt/models/staging/stg_customers.sql +0 -22
  234. package/recce-source/integration_tests/dbt/models/staging/stg_orders.sql +0 -23
  235. package/recce-source/integration_tests/dbt/models/staging/stg_payments.sql +0 -25
  236. package/recce-source/integration_tests/dbt/packages.yml +0 -7
  237. package/recce-source/integration_tests/dbt/profiles.yml +0 -8
  238. package/recce-source/integration_tests/dbt/seeds/raw_customers.csv +0 -101
  239. package/recce-source/integration_tests/dbt/seeds/raw_orders.csv +0 -100
  240. package/recce-source/integration_tests/dbt/seeds/raw_payments.csv +0 -114
  241. package/recce-source/integration_tests/dbt/seeds/raw_statuses.csv +0 -5
  242. package/recce-source/integration_tests/dbt/smoke_test.sh +0 -72
  243. package/recce-source/integration_tests/dbt/smoke_test_cloud.sh +0 -71
  244. package/recce-source/integration_tests/sqlmesh/__init__.py +0 -0
  245. package/recce-source/integration_tests/sqlmesh/audits/assert_item_price_above_zero.sql +0 -9
  246. package/recce-source/integration_tests/sqlmesh/audits/items.sql +0 -7
  247. package/recce-source/integration_tests/sqlmesh/audits/order_items.sql +0 -7
  248. package/recce-source/integration_tests/sqlmesh/config.py +0 -171
  249. package/recce-source/integration_tests/sqlmesh/helper.py +0 -20
  250. package/recce-source/integration_tests/sqlmesh/hooks/__init__.py +0 -0
  251. package/recce-source/integration_tests/sqlmesh/macros/__init__.py +0 -0
  252. package/recce-source/integration_tests/sqlmesh/macros/macros.py +0 -8
  253. package/recce-source/integration_tests/sqlmesh/macros/macros.sql +0 -8
  254. package/recce-source/integration_tests/sqlmesh/macros/utils.py +0 -11
  255. package/recce-source/integration_tests/sqlmesh/metrics/metrics.sql +0 -25
  256. package/recce-source/integration_tests/sqlmesh/models/customer_revenue_by_day.sql +0 -41
  257. package/recce-source/integration_tests/sqlmesh/models/customer_revenue_lifetime.sql +0 -60
  258. package/recce-source/integration_tests/sqlmesh/models/customers.sql +0 -32
  259. package/recce-source/integration_tests/sqlmesh/models/items.py +0 -95
  260. package/recce-source/integration_tests/sqlmesh/models/marketing.sql +0 -15
  261. package/recce-source/integration_tests/sqlmesh/models/order_items.py +0 -95
  262. package/recce-source/integration_tests/sqlmesh/models/orders.py +0 -70
  263. package/recce-source/integration_tests/sqlmesh/models/raw_marketing.py +0 -62
  264. package/recce-source/integration_tests/sqlmesh/models/top_waiters.sql +0 -23
  265. package/recce-source/integration_tests/sqlmesh/models/waiter_as_customer_by_day.sql +0 -29
  266. package/recce-source/integration_tests/sqlmesh/models/waiter_names.sql +0 -10
  267. package/recce-source/integration_tests/sqlmesh/models/waiter_revenue_by_day.sql +0 -29
  268. package/recce-source/integration_tests/sqlmesh/models/waiters.py +0 -62
  269. package/recce-source/integration_tests/sqlmesh/prep_env.sh +0 -16
  270. package/recce-source/integration_tests/sqlmesh/schema.yaml +0 -5
  271. package/recce-source/integration_tests/sqlmesh/seeds/waiter_names.csv +0 -11
  272. package/recce-source/integration_tests/sqlmesh/test_server.sh +0 -29
  273. package/recce-source/integration_tests/sqlmesh/tests/test_customer_revenue_by_day.yaml +0 -63
  274. package/recce-source/integration_tests/sqlmesh/tests/test_order_items.yaml +0 -72
  275. package/recce-source/js/.editorconfig +0 -27
  276. package/recce-source/js/.env.development +0 -5
  277. package/recce-source/js/.husky/pre-commit +0 -29
  278. package/recce-source/js/.nvmrc +0 -1
  279. package/recce-source/js/README.md +0 -39
  280. package/recce-source/js/app/(mainComponents)/DisplayModeToggle.tsx +0 -65
  281. package/recce-source/js/app/(mainComponents)/NavBar.tsx +0 -228
  282. package/recce-source/js/app/(mainComponents)/RecceVersionBadge.tsx +0 -107
  283. package/recce-source/js/app/(mainComponents)/TopBar.tsx +0 -252
  284. package/recce-source/js/app/@lineage/default.tsx +0 -20
  285. package/recce-source/js/app/@lineage/page.tsx +0 -14
  286. package/recce-source/js/app/MainLayout.tsx +0 -170
  287. package/recce-source/js/app/Providers.tsx +0 -49
  288. package/recce-source/js/app/checks/page.tsx +0 -296
  289. package/recce-source/js/app/error.tsx +0 -93
  290. package/recce-source/js/app/favicon.ico +0 -0
  291. package/recce-source/js/app/global-error.tsx +0 -115
  292. package/recce-source/js/app/global.css +0 -82
  293. package/recce-source/js/app/layout.tsx +0 -48
  294. package/recce-source/js/app/lineage/page.tsx +0 -15
  295. package/recce-source/js/app/page.tsx +0 -12
  296. package/recce-source/js/app/query/page.tsx +0 -8
  297. package/recce-source/js/biome.json +0 -313
  298. package/recce-source/js/jest.config.js +0 -34
  299. package/recce-source/js/jest.globals.d.ts +0 -32
  300. package/recce-source/js/jest.setup.js +0 -91
  301. package/recce-source/js/next.config.js +0 -16
  302. package/recce-source/js/package-lock.json +0 -13843
  303. package/recce-source/js/package.json +0 -123
  304. package/recce-source/js/pnpm-lock.yaml +0 -9235
  305. package/recce-source/js/pnpm-workspace.yaml +0 -6
  306. package/recce-source/js/postcss.config.js +0 -5
  307. package/recce-source/js/public/auth_callback.html +0 -68
  308. package/recce-source/js/public/imgs/feedback/thumbs-down.png +0 -0
  309. package/recce-source/js/public/imgs/feedback/thumbs-up.png +0 -0
  310. package/recce-source/js/public/imgs/reload-image.svg +0 -4
  311. package/recce-source/js/public/logo/recce-logo-white.png +0 -0
  312. package/recce-source/js/src/components/AuthModal/AuthModal.tsx +0 -202
  313. package/recce-source/js/src/components/app/AvatarDropdown.tsx +0 -159
  314. package/recce-source/js/src/components/app/EnvInfo.tsx +0 -357
  315. package/recce-source/js/src/components/app/Filename.tsx +0 -388
  316. package/recce-source/js/src/components/app/SetupConnectionPopover.tsx +0 -91
  317. package/recce-source/js/src/components/app/StateExporter.tsx +0 -57
  318. package/recce-source/js/src/components/app/StateImporter.tsx +0 -198
  319. package/recce-source/js/src/components/app/StateSharing.tsx +0 -145
  320. package/recce-source/js/src/components/app/StateSynchronizer.tsx +0 -205
  321. package/recce-source/js/src/components/charts/HistogramChart.tsx +0 -291
  322. package/recce-source/js/src/components/charts/SquareIcon.tsx +0 -51
  323. package/recce-source/js/src/components/charts/TopKSummaryList.tsx +0 -457
  324. package/recce-source/js/src/components/charts/chartTheme.ts +0 -74
  325. package/recce-source/js/src/components/check/CheckBreadcrumb.tsx +0 -97
  326. package/recce-source/js/src/components/check/CheckDescription.tsx +0 -134
  327. package/recce-source/js/src/components/check/CheckDetail.tsx +0 -797
  328. package/recce-source/js/src/components/check/CheckEmptyState.tsx +0 -84
  329. package/recce-source/js/src/components/check/CheckList.tsx +0 -320
  330. package/recce-source/js/src/components/check/LineageDiffView.tsx +0 -32
  331. package/recce-source/js/src/components/check/PresetCheckTemplateView.tsx +0 -48
  332. package/recce-source/js/src/components/check/SchemaDiffView.tsx +0 -290
  333. package/recce-source/js/src/components/check/check.ts +0 -25
  334. package/recce-source/js/src/components/check/timeline/CheckTimeline.tsx +0 -163
  335. package/recce-source/js/src/components/check/timeline/CommentInput.tsx +0 -84
  336. package/recce-source/js/src/components/check/timeline/TimelineEvent.tsx +0 -468
  337. package/recce-source/js/src/components/check/timeline/index.ts +0 -12
  338. package/recce-source/js/src/components/check/utils.ts +0 -12
  339. package/recce-source/js/src/components/data-grid/ScreenshotDataGrid.tsx +0 -333
  340. package/recce-source/js/src/components/data-grid/agGridStyles.css +0 -55
  341. package/recce-source/js/src/components/data-grid/agGridTheme.ts +0 -43
  342. package/recce-source/js/src/components/editor/CodeEditor.tsx +0 -107
  343. package/recce-source/js/src/components/editor/DiffEditor.tsx +0 -162
  344. package/recce-source/js/src/components/editor/index.ts +0 -12
  345. package/recce-source/js/src/components/errorboundary/ErrorBoundary.tsx +0 -87
  346. package/recce-source/js/src/components/histogram/HistogramDiffForm.tsx +0 -147
  347. package/recce-source/js/src/components/histogram/HistogramDiffResultView.tsx +0 -63
  348. package/recce-source/js/src/components/icons/index.tsx +0 -142
  349. package/recce-source/js/src/components/lineage/ActionControl.tsx +0 -63
  350. package/recce-source/js/src/components/lineage/ActionTag.tsx +0 -141
  351. package/recce-source/js/src/components/lineage/ChangeStatusLegend.tsx +0 -46
  352. package/recce-source/js/src/components/lineage/ColumnLevelLineageControl.tsx +0 -327
  353. package/recce-source/js/src/components/lineage/ColumnLevelLineageLegend.tsx +0 -57
  354. package/recce-source/js/src/components/lineage/GraphColumnNode.tsx +0 -199
  355. package/recce-source/js/src/components/lineage/GraphEdge.tsx +0 -59
  356. package/recce-source/js/src/components/lineage/GraphNode.tsx +0 -555
  357. package/recce-source/js/src/components/lineage/LineagePage.tsx +0 -10
  358. package/recce-source/js/src/components/lineage/LineageView.tsx +0 -1384
  359. package/recce-source/js/src/components/lineage/LineageViewContext.tsx +0 -86
  360. package/recce-source/js/src/components/lineage/LineageViewContextMenu.tsx +0 -637
  361. package/recce-source/js/src/components/lineage/LineageViewNotification.tsx +0 -64
  362. package/recce-source/js/src/components/lineage/LineageViewTopBar.tsx +0 -596
  363. package/recce-source/js/src/components/lineage/NodeSqlView.tsx +0 -136
  364. package/recce-source/js/src/components/lineage/NodeTag.tsx +0 -278
  365. package/recce-source/js/src/components/lineage/NodeView.tsx +0 -642
  366. package/recce-source/js/src/components/lineage/SandboxView.tsx +0 -436
  367. package/recce-source/js/src/components/lineage/ServerDisconnectedModalContent.tsx +0 -105
  368. package/recce-source/js/src/components/lineage/SetupConnectionBanner.tsx +0 -52
  369. package/recce-source/js/src/components/lineage/SingleEnvironmentQueryView.tsx +0 -152
  370. package/recce-source/js/src/components/lineage/graph.test.ts +0 -31
  371. package/recce-source/js/src/components/lineage/graph.ts +0 -58
  372. package/recce-source/js/src/components/lineage/lineage.test.ts +0 -169
  373. package/recce-source/js/src/components/lineage/lineage.ts +0 -521
  374. package/recce-source/js/src/components/lineage/styles.css +0 -42
  375. package/recce-source/js/src/components/lineage/styles.tsx +0 -165
  376. package/recce-source/js/src/components/lineage/useMultiNodesAction.ts +0 -352
  377. package/recce-source/js/src/components/lineage/useValueDiffAlertDialog.tsx +0 -108
  378. package/recce-source/js/src/components/onboarding-guide/Notification.tsx +0 -62
  379. package/recce-source/js/src/components/profile/ProfileDiffForm.tsx +0 -134
  380. package/recce-source/js/src/components/profile/ProfileDiffResultView.tsx +0 -243
  381. package/recce-source/js/src/components/query/ChangedOnlyCheckbox.tsx +0 -29
  382. package/recce-source/js/src/components/query/DiffText.tsx +0 -120
  383. package/recce-source/js/src/components/query/QueryDiffResultView.tsx +0 -468
  384. package/recce-source/js/src/components/query/QueryForm.tsx +0 -80
  385. package/recce-source/js/src/components/query/QueryPage.tsx +0 -282
  386. package/recce-source/js/src/components/query/QueryResultView.tsx +0 -180
  387. package/recce-source/js/src/components/query/SetupConnectionGuide.tsx +0 -57
  388. package/recce-source/js/src/components/query/SqlEditor.tsx +0 -245
  389. package/recce-source/js/src/components/query/ToggleSwitch.tsx +0 -84
  390. package/recce-source/js/src/components/query/styles.css +0 -21
  391. package/recce-source/js/src/components/routing/DirectUrlAccess.test.tsx +0 -428
  392. package/recce-source/js/src/components/routing/LineageStatePreservation.test.tsx +0 -311
  393. package/recce-source/js/src/components/routing/Navigation.test.tsx +0 -256
  394. package/recce-source/js/src/components/rowcount/RowCountDiffResultView.tsx +0 -108
  395. package/recce-source/js/src/components/rowcount/delta.test.ts +0 -51
  396. package/recce-source/js/src/components/rowcount/delta.ts +0 -16
  397. package/recce-source/js/src/components/run/RunList.tsx +0 -303
  398. package/recce-source/js/src/components/run/RunModal.tsx +0 -191
  399. package/recce-source/js/src/components/run/RunPage.tsx +0 -26
  400. package/recce-source/js/src/components/run/RunResultPane.tsx +0 -578
  401. package/recce-source/js/src/components/run/RunStatusAndDate.tsx +0 -106
  402. package/recce-source/js/src/components/run/RunToolbar.tsx +0 -70
  403. package/recce-source/js/src/components/run/RunView.tsx +0 -196
  404. package/recce-source/js/src/components/run/registry.ts +0 -214
  405. package/recce-source/js/src/components/run/types.ts +0 -14
  406. package/recce-source/js/src/components/schema/ColumnNameCell.test.tsx +0 -169
  407. package/recce-source/js/src/components/schema/ColumnNameCell.tsx +0 -198
  408. package/recce-source/js/src/components/schema/SchemaView.tsx +0 -336
  409. package/recce-source/js/src/components/schema/schemaDiff.ts +0 -32
  410. package/recce-source/js/src/components/schema/style.css +0 -134
  411. package/recce-source/js/src/components/screenshot/ScreenshotBox.tsx +0 -39
  412. package/recce-source/js/src/components/shared/HistoryToggle.tsx +0 -35
  413. package/recce-source/js/src/components/split/Split.tsx +0 -40
  414. package/recce-source/js/src/components/split/styles.css +0 -24
  415. package/recce-source/js/src/components/summary/ChangeSummary.tsx +0 -264
  416. package/recce-source/js/src/components/summary/SchemaSummary.tsx +0 -123
  417. package/recce-source/js/src/components/summary/SummaryView.tsx +0 -29
  418. package/recce-source/js/src/components/timeout/IdleTimeoutBadge.tsx +0 -48
  419. package/recce-source/js/src/components/top-k/TopKDiffForm.tsx +0 -58
  420. package/recce-source/js/src/components/top-k/TopKDiffResultView.tsx +0 -73
  421. package/recce-source/js/src/components/ui/dataGrid/DataFrameColumnGroupHeader.tsx +0 -228
  422. package/recce-source/js/src/components/ui/dataGrid/DataFrameColumnHeader.tsx +0 -113
  423. package/recce-source/js/src/components/ui/dataGrid/defaultRenderCell.tsx +0 -72
  424. package/recce-source/js/src/components/ui/dataGrid/index.ts +0 -23
  425. package/recce-source/js/src/components/ui/dataGrid/inlineRenderCell.test.tsx +0 -607
  426. package/recce-source/js/src/components/ui/dataGrid/inlineRenderCell.tsx +0 -211
  427. package/recce-source/js/src/components/ui/dataGrid/schemaCells.test.tsx +0 -452
  428. package/recce-source/js/src/components/ui/dataGrid/schemaCells.tsx +0 -142
  429. package/recce-source/js/src/components/ui/dataGrid/valueDiffCells.test.tsx +0 -178
  430. package/recce-source/js/src/components/ui/dataGrid/valueDiffCells.tsx +0 -275
  431. package/recce-source/js/src/components/ui/markdown/ExternalLinkConfirmDialog.tsx +0 -134
  432. package/recce-source/js/src/components/ui/markdown/MarkdownContent.tsx +0 -364
  433. package/recce-source/js/src/components/ui/mui/index.ts +0 -13
  434. package/recce-source/js/src/components/ui/mui-provider.tsx +0 -67
  435. package/recce-source/js/src/components/ui/mui-theme.ts +0 -1039
  436. package/recce-source/js/src/components/ui/mui-utils.ts +0 -113
  437. package/recce-source/js/src/components/ui/toaster.tsx +0 -288
  438. package/recce-source/js/src/components/valuediff/ValueDiffDetailResultView.tsx +0 -216
  439. package/recce-source/js/src/components/valuediff/ValueDiffForm.tsx +0 -246
  440. package/recce-source/js/src/components/valuediff/ValueDiffResultView.tsx +0 -81
  441. package/recce-source/js/src/components/valuediff/shared.ts +0 -33
  442. package/recce-source/js/src/constants/tooltipMessage.ts +0 -3
  443. package/recce-source/js/src/constants/urls.ts +0 -1
  444. package/recce-source/js/src/lib/UrlHash.ts +0 -12
  445. package/recce-source/js/src/lib/api/adhocQuery.ts +0 -70
  446. package/recce-source/js/src/lib/api/axiosClient.ts +0 -9
  447. package/recce-source/js/src/lib/api/cacheKeys.ts +0 -13
  448. package/recce-source/js/src/lib/api/checkEvents.ts +0 -252
  449. package/recce-source/js/src/lib/api/checks.ts +0 -129
  450. package/recce-source/js/src/lib/api/cll.ts +0 -53
  451. package/recce-source/js/src/lib/api/connectToCloud.ts +0 -13
  452. package/recce-source/js/src/lib/api/flag.ts +0 -37
  453. package/recce-source/js/src/lib/api/info.ts +0 -198
  454. package/recce-source/js/src/lib/api/instanceInfo.ts +0 -25
  455. package/recce-source/js/src/lib/api/keepAlive.ts +0 -108
  456. package/recce-source/js/src/lib/api/lineagecheck.ts +0 -35
  457. package/recce-source/js/src/lib/api/localStorageKeys.ts +0 -7
  458. package/recce-source/js/src/lib/api/models.ts +0 -59
  459. package/recce-source/js/src/lib/api/profile.ts +0 -65
  460. package/recce-source/js/src/lib/api/rowcount.ts +0 -19
  461. package/recce-source/js/src/lib/api/runs.ts +0 -174
  462. package/recce-source/js/src/lib/api/schemacheck.ts +0 -31
  463. package/recce-source/js/src/lib/api/select.ts +0 -25
  464. package/recce-source/js/src/lib/api/sessionStorageKeys.ts +0 -8
  465. package/recce-source/js/src/lib/api/state.ts +0 -117
  466. package/recce-source/js/src/lib/api/track.ts +0 -281
  467. package/recce-source/js/src/lib/api/types.ts +0 -284
  468. package/recce-source/js/src/lib/api/user.ts +0 -42
  469. package/recce-source/js/src/lib/api/valuediff.ts +0 -46
  470. package/recce-source/js/src/lib/api/version.ts +0 -40
  471. package/recce-source/js/src/lib/const.ts +0 -9
  472. package/recce-source/js/src/lib/csv/extractors.test.ts +0 -456
  473. package/recce-source/js/src/lib/csv/extractors.ts +0 -468
  474. package/recce-source/js/src/lib/csv/format.test.ts +0 -211
  475. package/recce-source/js/src/lib/csv/format.ts +0 -44
  476. package/recce-source/js/src/lib/csv/index.test.ts +0 -155
  477. package/recce-source/js/src/lib/csv/index.ts +0 -109
  478. package/recce-source/js/src/lib/dataGrid/crossFunctionConsistency.test.ts +0 -626
  479. package/recce-source/js/src/lib/dataGrid/dataGridFactory.test.ts +0 -2140
  480. package/recce-source/js/src/lib/dataGrid/dataGridFactory.ts +0 -397
  481. package/recce-source/js/src/lib/dataGrid/generators/rowCountUtils.test.ts +0 -132
  482. package/recce-source/js/src/lib/dataGrid/generators/rowCountUtils.ts +0 -126
  483. package/recce-source/js/src/lib/dataGrid/generators/toDataDiffGrid.test.ts +0 -1627
  484. package/recce-source/js/src/lib/dataGrid/generators/toDataDiffGrid.ts +0 -140
  485. package/recce-source/js/src/lib/dataGrid/generators/toDataGrid.ts +0 -67
  486. package/recce-source/js/src/lib/dataGrid/generators/toRowCountDataGrid.test.ts +0 -142
  487. package/recce-source/js/src/lib/dataGrid/generators/toRowCountDataGrid.ts +0 -71
  488. package/recce-source/js/src/lib/dataGrid/generators/toRowCountDiffDataGrid.test.ts +0 -258
  489. package/recce-source/js/src/lib/dataGrid/generators/toRowCountDiffDataGrid.ts +0 -153
  490. package/recce-source/js/src/lib/dataGrid/generators/toSchemaDataGrid.test.ts +0 -951
  491. package/recce-source/js/src/lib/dataGrid/generators/toSchemaDataGrid.ts +0 -221
  492. package/recce-source/js/src/lib/dataGrid/generators/toValueDataGrid.test.ts +0 -395
  493. package/recce-source/js/src/lib/dataGrid/generators/toValueDataGrid.ts +0 -184
  494. package/recce-source/js/src/lib/dataGrid/generators/toValueDiffGrid.test.ts +0 -884
  495. package/recce-source/js/src/lib/dataGrid/generators/toValueDiffGrid.ts +0 -113
  496. package/recce-source/js/src/lib/dataGrid/index.ts +0 -51
  497. package/recce-source/js/src/lib/dataGrid/propertyBased.test.ts +0 -858
  498. package/recce-source/js/src/lib/dataGrid/shared/columnBuilders.test.ts +0 -482
  499. package/recce-source/js/src/lib/dataGrid/shared/columnBuilders.ts +0 -345
  500. package/recce-source/js/src/lib/dataGrid/shared/dataTypeEdgeCases.test.ts +0 -698
  501. package/recce-source/js/src/lib/dataGrid/shared/diffColumnBuilder.test.tsx +0 -820
  502. package/recce-source/js/src/lib/dataGrid/shared/diffColumnBuilder.tsx +0 -277
  503. package/recce-source/js/src/lib/dataGrid/shared/gridUtils.test.ts +0 -785
  504. package/recce-source/js/src/lib/dataGrid/shared/gridUtils.ts +0 -370
  505. package/recce-source/js/src/lib/dataGrid/shared/index.ts +0 -81
  506. package/recce-source/js/src/lib/dataGrid/shared/rowBuilders.test.ts +0 -909
  507. package/recce-source/js/src/lib/dataGrid/shared/rowBuilders.ts +0 -325
  508. package/recce-source/js/src/lib/dataGrid/shared/simpleColumnBuilder.tsx +0 -240
  509. package/recce-source/js/src/lib/dataGrid/shared/toDiffColumn.test.tsx +0 -719
  510. package/recce-source/js/src/lib/dataGrid/shared/toDiffColumn.tsx +0 -231
  511. package/recce-source/js/src/lib/dataGrid/shared/validation.test.ts +0 -559
  512. package/recce-source/js/src/lib/dataGrid/shared/validation.ts +0 -367
  513. package/recce-source/js/src/lib/dataGrid/warehouseNamingConventions.test.ts +0 -1117
  514. package/recce-source/js/src/lib/formatSelect.ts +0 -50
  515. package/recce-source/js/src/lib/hooks/ApiConfigContext.tsx +0 -181
  516. package/recce-source/js/src/lib/hooks/IdleTimeoutContext.tsx +0 -177
  517. package/recce-source/js/src/lib/hooks/LineageGraphContext.tsx +0 -512
  518. package/recce-source/js/src/lib/hooks/RecceActionContext.tsx +0 -269
  519. package/recce-source/js/src/lib/hooks/RecceCheckContext.tsx +0 -33
  520. package/recce-source/js/src/lib/hooks/RecceContextProvider.tsx +0 -54
  521. package/recce-source/js/src/lib/hooks/RecceInstanceContext.tsx +0 -129
  522. package/recce-source/js/src/lib/hooks/RecceQueryContext.tsx +0 -98
  523. package/recce-source/js/src/lib/hooks/RecceShareStateContext.tsx +0 -59
  524. package/recce-source/js/src/lib/hooks/ScreenShot.tsx +0 -399
  525. package/recce-source/js/src/lib/hooks/useAppRouter.test.ts +0 -211
  526. package/recce-source/js/src/lib/hooks/useAppRouter.ts +0 -200
  527. package/recce-source/js/src/lib/hooks/useCSVExport.ts +0 -136
  528. package/recce-source/js/src/lib/hooks/useCheckEvents.ts +0 -99
  529. package/recce-source/js/src/lib/hooks/useCheckToast.tsx +0 -14
  530. package/recce-source/js/src/lib/hooks/useClipBoardToast.tsx +0 -27
  531. package/recce-source/js/src/lib/hooks/useCountdownToast.tsx +0 -102
  532. package/recce-source/js/src/lib/hooks/useFeedbackCollectionToast.tsx +0 -130
  533. package/recce-source/js/src/lib/hooks/useGuideToast.tsx +0 -45
  534. package/recce-source/js/src/lib/hooks/useIdleDetection.tsx +0 -185
  535. package/recce-source/js/src/lib/hooks/useModelColumns.tsx +0 -113
  536. package/recce-source/js/src/lib/hooks/useRecceInstanceInfo.tsx +0 -13
  537. package/recce-source/js/src/lib/hooks/useRecceServerFlag.tsx +0 -13
  538. package/recce-source/js/src/lib/hooks/useRun.tsx +0 -89
  539. package/recce-source/js/src/lib/hooks/useThemeColors.ts +0 -115
  540. package/recce-source/js/src/lib/mergeKeys.test.ts +0 -89
  541. package/recce-source/js/src/lib/mergeKeys.ts +0 -86
  542. package/recce-source/js/src/lib/result/ResultErrorFallback.tsx +0 -9
  543. package/recce-source/js/src/lib/utils/formatTime.ts +0 -84
  544. package/recce-source/js/src/lib/utils/urls.ts +0 -16
  545. package/recce-source/js/src/utils/DropdownValuesInput.tsx +0 -297
  546. package/recce-source/js/src/utils/formatters.tsx +0 -237
  547. package/recce-source/js/src/utils/transforms.ts +0 -81
  548. package/recce-source/js/tsconfig.json +0 -47
  549. package/recce-source/macros/README.md +0 -8
  550. package/recce-source/macros/recce_athena.sql +0 -73
  551. package/recce-source/pyproject.toml +0 -109
  552. package/recce-source/recce/VERSION +0 -1
  553. package/recce-source/recce/__init__.py +0 -84
  554. package/recce-source/recce/adapter/__init__.py +0 -0
  555. package/recce-source/recce/adapter/base.py +0 -109
  556. package/recce-source/recce/adapter/dbt_adapter/__init__.py +0 -1699
  557. package/recce-source/recce/adapter/dbt_adapter/dbt_version.py +0 -42
  558. package/recce-source/recce/adapter/sqlmesh_adapter.py +0 -141
  559. package/recce-source/recce/apis/__init__.py +0 -0
  560. package/recce-source/recce/apis/check_api.py +0 -203
  561. package/recce-source/recce/apis/check_events_api.py +0 -353
  562. package/recce-source/recce/apis/check_func.py +0 -130
  563. package/recce-source/recce/apis/run_api.py +0 -130
  564. package/recce-source/recce/apis/run_func.py +0 -258
  565. package/recce-source/recce/artifact.py +0 -266
  566. package/recce-source/recce/cli.py +0 -1846
  567. package/recce-source/recce/config.py +0 -127
  568. package/recce-source/recce/connect_to_cloud.py +0 -138
  569. package/recce-source/recce/core.py +0 -334
  570. package/recce-source/recce/diff.py +0 -26
  571. package/recce-source/recce/event/CONFIG +0 -1
  572. package/recce-source/recce/event/SENTRY_DNS +0 -1
  573. package/recce-source/recce/event/__init__.py +0 -304
  574. package/recce-source/recce/event/collector.py +0 -184
  575. package/recce-source/recce/event/track.py +0 -158
  576. package/recce-source/recce/exceptions.py +0 -21
  577. package/recce-source/recce/git.py +0 -77
  578. package/recce-source/recce/github.py +0 -222
  579. package/recce-source/recce/mcp_server.py +0 -885
  580. package/recce-source/recce/models/__init__.py +0 -6
  581. package/recce-source/recce/models/check.py +0 -481
  582. package/recce-source/recce/models/run.py +0 -46
  583. package/recce-source/recce/models/types.py +0 -218
  584. package/recce-source/recce/pull_request.py +0 -124
  585. package/recce-source/recce/run.py +0 -390
  586. package/recce-source/recce/server.py +0 -877
  587. package/recce-source/recce/state/__init__.py +0 -31
  588. package/recce-source/recce/state/cloud.py +0 -644
  589. package/recce-source/recce/state/const.py +0 -26
  590. package/recce-source/recce/state/local.py +0 -56
  591. package/recce-source/recce/state/state.py +0 -119
  592. package/recce-source/recce/state/state_loader.py +0 -174
  593. package/recce-source/recce/summary.py +0 -575
  594. package/recce-source/recce/tasks/__init__.py +0 -23
  595. package/recce-source/recce/tasks/core.py +0 -134
  596. package/recce-source/recce/tasks/dataframe.py +0 -170
  597. package/recce-source/recce/tasks/histogram.py +0 -433
  598. package/recce-source/recce/tasks/lineage.py +0 -19
  599. package/recce-source/recce/tasks/profile.py +0 -298
  600. package/recce-source/recce/tasks/query.py +0 -450
  601. package/recce-source/recce/tasks/rowcount.py +0 -277
  602. package/recce-source/recce/tasks/schema.py +0 -65
  603. package/recce-source/recce/tasks/top_k.py +0 -172
  604. package/recce-source/recce/tasks/utils.py +0 -147
  605. package/recce-source/recce/tasks/valuediff.py +0 -497
  606. package/recce-source/recce/util/__init__.py +0 -4
  607. package/recce-source/recce/util/api_token.py +0 -80
  608. package/recce-source/recce/util/breaking.py +0 -330
  609. package/recce-source/recce/util/cache.py +0 -25
  610. package/recce-source/recce/util/cll.py +0 -355
  611. package/recce-source/recce/util/cloud/__init__.py +0 -15
  612. package/recce-source/recce/util/cloud/base.py +0 -115
  613. package/recce-source/recce/util/cloud/check_events.py +0 -190
  614. package/recce-source/recce/util/cloud/checks.py +0 -242
  615. package/recce-source/recce/util/io.py +0 -120
  616. package/recce-source/recce/util/lineage.py +0 -83
  617. package/recce-source/recce/util/logger.py +0 -25
  618. package/recce-source/recce/util/onboarding_state.py +0 -45
  619. package/recce-source/recce/util/perf_tracking.py +0 -85
  620. package/recce-source/recce/util/pydantic_model.py +0 -22
  621. package/recce-source/recce/util/recce_cloud.py +0 -454
  622. package/recce-source/recce/util/singleton.py +0 -18
  623. package/recce-source/recce/util/startup_perf.py +0 -121
  624. package/recce-source/recce/yaml/__init__.py +0 -58
  625. package/recce-source/recce_cloud/README.md +0 -780
  626. package/recce-source/recce_cloud/VERSION +0 -1
  627. package/recce-source/recce_cloud/__init__.py +0 -24
  628. package/recce-source/recce_cloud/api/__init__.py +0 -17
  629. package/recce-source/recce_cloud/api/base.py +0 -132
  630. package/recce-source/recce_cloud/api/client.py +0 -186
  631. package/recce-source/recce_cloud/api/exceptions.py +0 -26
  632. package/recce-source/recce_cloud/api/factory.py +0 -63
  633. package/recce-source/recce_cloud/api/github.py +0 -106
  634. package/recce-source/recce_cloud/api/gitlab.py +0 -111
  635. package/recce-source/recce_cloud/artifact.py +0 -57
  636. package/recce-source/recce_cloud/ci_providers/__init__.py +0 -9
  637. package/recce-source/recce_cloud/ci_providers/base.py +0 -82
  638. package/recce-source/recce_cloud/ci_providers/detector.py +0 -147
  639. package/recce-source/recce_cloud/ci_providers/github_actions.py +0 -136
  640. package/recce-source/recce_cloud/ci_providers/gitlab_ci.py +0 -130
  641. package/recce-source/recce_cloud/cli.py +0 -434
  642. package/recce-source/recce_cloud/download.py +0 -230
  643. package/recce-source/recce_cloud/hatch_build.py +0 -20
  644. package/recce-source/recce_cloud/pyproject.toml +0 -49
  645. package/recce-source/recce_cloud/upload.py +0 -214
  646. package/recce-source/test.py +0 -0
  647. package/recce-source/tests/__init__.py +0 -0
  648. package/recce-source/tests/adapter/__init__.py +0 -0
  649. package/recce-source/tests/adapter/dbt_adapter/__init__.py +0 -0
  650. package/recce-source/tests/adapter/dbt_adapter/conftest.py +0 -17
  651. package/recce-source/tests/adapter/dbt_adapter/dbt_test_helper.py +0 -298
  652. package/recce-source/tests/adapter/dbt_adapter/test_dbt_adapter.py +0 -25
  653. package/recce-source/tests/adapter/dbt_adapter/test_dbt_cll.py +0 -717
  654. package/recce-source/tests/adapter/dbt_adapter/test_proj/dbt_project.yml +0 -4
  655. package/recce-source/tests/adapter/dbt_adapter/test_proj/manifest.json +0 -1
  656. package/recce-source/tests/adapter/dbt_adapter/test_proj/package-lock.yml +0 -8
  657. package/recce-source/tests/adapter/dbt_adapter/test_proj/packages.yml +0 -7
  658. package/recce-source/tests/adapter/dbt_adapter/test_proj/profiles.yml +0 -6
  659. package/recce-source/tests/adapter/dbt_adapter/test_selector.py +0 -205
  660. package/recce-source/tests/apis/__init__.py +0 -0
  661. package/recce-source/tests/apis/row_count_diff.json +0 -59
  662. package/recce-source/tests/apis/test_check_events_api.py +0 -615
  663. package/recce-source/tests/apis/test_run_func.py +0 -433
  664. package/recce-source/tests/catalog.json +0 -527
  665. package/recce-source/tests/data/manifest/base/catalog.json +0 -1
  666. package/recce-source/tests/data/manifest/base/manifest.json +0 -1
  667. package/recce-source/tests/data/manifest/pr2/catalog.json +0 -1
  668. package/recce-source/tests/data/manifest/pr2/manifest.json +0 -1
  669. package/recce-source/tests/manifest.json +0 -10655
  670. package/recce-source/tests/models/__init__.py +0 -0
  671. package/recce-source/tests/models/test_check.py +0 -731
  672. package/recce-source/tests/models/test_run_models.py +0 -295
  673. package/recce-source/tests/recce_cloud/__init__.py +0 -0
  674. package/recce-source/tests/recce_cloud/test_ci_providers.py +0 -351
  675. package/recce-source/tests/recce_cloud/test_cli.py +0 -735
  676. package/recce-source/tests/recce_cloud/test_client.py +0 -379
  677. package/recce-source/tests/recce_cloud/test_platform_clients.py +0 -483
  678. package/recce-source/tests/recce_state.json +0 -1
  679. package/recce-source/tests/state/test_cloud.py +0 -719
  680. package/recce-source/tests/state/test_local.py +0 -164
  681. package/recce-source/tests/state/test_state_loader.py +0 -211
  682. package/recce-source/tests/tasks/__init__.py +0 -0
  683. package/recce-source/tests/tasks/conftest.py +0 -4
  684. package/recce-source/tests/tasks/test_histogram.py +0 -129
  685. package/recce-source/tests/tasks/test_lineage.py +0 -55
  686. package/recce-source/tests/tasks/test_preset_checks.py +0 -64
  687. package/recce-source/tests/tasks/test_profile.py +0 -397
  688. package/recce-source/tests/tasks/test_query.py +0 -528
  689. package/recce-source/tests/tasks/test_row_count.py +0 -133
  690. package/recce-source/tests/tasks/test_schema.py +0 -122
  691. package/recce-source/tests/tasks/test_top_k.py +0 -77
  692. package/recce-source/tests/tasks/test_utils.py +0 -439
  693. package/recce-source/tests/tasks/test_valuediff.py +0 -361
  694. package/recce-source/tests/test_cli.py +0 -236
  695. package/recce-source/tests/test_cli_mcp_optional.py +0 -45
  696. package/recce-source/tests/test_cloud_listing_cli.py +0 -324
  697. package/recce-source/tests/test_config.py +0 -43
  698. package/recce-source/tests/test_connect_to_cloud.py +0 -82
  699. package/recce-source/tests/test_core.py +0 -174
  700. package/recce-source/tests/test_dbt.py +0 -36
  701. package/recce-source/tests/test_mcp_server.py +0 -505
  702. package/recce-source/tests/test_pull_request.py +0 -130
  703. package/recce-source/tests/test_server.py +0 -202
  704. package/recce-source/tests/test_server_lifespan.py +0 -138
  705. package/recce-source/tests/test_summary.py +0 -73
  706. package/recce-source/tests/util/__init__.py +0 -0
  707. package/recce-source/tests/util/cloud/__init__.py +0 -0
  708. package/recce-source/tests/util/cloud/test_check_events.py +0 -255
  709. package/recce-source/tests/util/cloud/test_checks.py +0 -204
  710. package/recce-source/tests/util/test_api_token.py +0 -119
  711. package/recce-source/tests/util/test_breaking.py +0 -1427
  712. package/recce-source/tests/util/test_cll.py +0 -706
  713. package/recce-source/tests/util/test_lineage.py +0 -122
  714. package/recce-source/tests/util/test_onboarding_state.py +0 -84
  715. package/recce-source/tests/util/test_recce_cloud.py +0 -231
  716. package/recce-source/tox.ini +0 -40
  717. package/recce-source/uv.lock +0 -3928
  718. package/src/api/index.ts +0 -32
  719. package/src/components/index.ts +0 -154
  720. package/src/global.d.ts +0 -14
  721. package/src/hooks/index.ts +0 -56
  722. package/src/index.ts +0 -17
  723. package/src/lib/hooks/RouteConfigContext.ts +0 -139
  724. package/src/lib/hooks/useAppRouter.ts +0 -240
  725. package/src/mui-augmentation.d.ts +0 -139
  726. package/src/theme/index.ts +0 -13
  727. package/src/theme.ts +0 -23
  728. package/src/types/index.ts +0 -23
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src-BgHSbbHk.js","names":["ThemeProvider","nodeId","MuiTooltip","BaseActionControl","BaseColumnLevelLineageControl","columnData: LineageColumnNodeData","style: React.CSSProperties","getIconForChangeStatus","style","GraphEdgeBase","RowCountDiffTag","colorMap: Record<string, string>","event","MuiTooltip","Popover","error","TimelineEvent","combinedColumns: Record<string, NodeColumnData | undefined>","MuiTooltip","MuiTooltip","type","params: QueryParams","options: SubmitOptions","countMap: Record<string, number>","SqlEditor","RowCountDiffTag","tagLabel: string","chipColor: \"default\" | \"success\" | \"error\"","schemaChanged: boolean | undefined","rowCountChanged: boolean | undefined","getIconForChangeStatus","MuiTooltip","error","nodeChangeStatus: NodeChangeStatus | undefined","nodeSelectMode: SelectMode","GraphEdge","initialNodes: LineageGraphNode[]","getIconForChangeStatus","menuItems: ContextMenuItem[]","trackProps: SubmitRunTrackProps","findByRunType","LineageViewContextMenu","useLineageViewContextMenu","position","node","useCopyToClipboard","error","nodes","EXPLORE_ACTION","EXPLORE_SOURCE","useMultiNodesActionBase","useBaseDialog","EXPLORE_ACTION","BaseLineageViewContextMenu","baseUseLineageViewContextMenu","union","distance","v","w","v","offset","prefix","start","g","start","edge","prefix","xs","nodes: LineageGraphNodes[]","edges: LineageGraphEdge[]","nodeColumnSetMap: NodeColumnSetMap","parentMap","dagre","CodeEditor","DiffEditor","BaseNodeSqlView","tagStartElementSx: SxProps<Theme>","ResourceTypeTag","lastRowCount: RowCountDiff | undefined","MuiTooltip","MuiTooltip","extendedCallbacks: NodeViewActionCallbacks","ResourceTypeTag","RowCountTag","RowCountDiffTag","SingleEnvSchemaView","SchemaView","NodeSqlView","QueryForm","MuiTooltip","DiffEditor","BaseSandboxView","RunResultPane","ResourceTypeTagBase","runTypeIcons: RunTypeIconMap","actionCallbacks: NodeViewActionCallbacks","EXPLORE_ACTION","EXPLORE_SOURCE","BaseNodeView","BaseSetupConnectionBanner","error","MuiTooltip","style","SetupConnectionPopoverSlot","LineageViewTopBarCore","filteredNodeIds: string[]","useMultiNodesAction","nodes","highlightedModels: Set<string>","filteredNodeIds: string[] | undefined","newViewOptions: LineageDiffViewOptions","_","cll: ColumnLineageData | undefined","edges","nodeColumnSetMap","filteredNodeIds","cll","selectedNodes: string[] | undefined","useValueDiffAlertDialog","contextValue: LineageViewContextType","check: Check | undefined","error","LineageViewTopBar","SetupConnectionBanner","NodeView","error","useTheme","trackingData: EnvironmentConfigProps","formatTimestamp","MuiTooltip","error","saveAs","error: unknown","MuiTooltip","newErrorMessage: string | undefined","error","MuiTooltip","error","MuiTooltip","error","MuiTabs","version","DisplayModeToggle","RecceVersionBadge","TopBar","NavBar","RunResultPane","error","MuiTooltip","TemplateTag","trimResultTransformer","stripIndentTransformer","replaceResultTransformer","replaceSubstitutionTransformer","defaults","inlineArrayTransformer","splitStringTransformer","isValidValue","removeNonPrintingValuesTransformer","TemplateTag","inlineArrayTransformer","stripIndentTransformer","trimResultTransformer","TemplateTag","inlineArrayTransformer","stripIndentTransformer","trimResultTransformer","TemplateTag","inlineArrayTransformer","stripIndentTransformer","trimResultTransformer","TemplateTag","splitStringTransformer","removeNonPrintingValuesTransformer","inlineArrayTransformer","stripIndentTransformer","trimResultTransformer","TemplateTag","splitStringTransformer","inlineArrayTransformer","stripIndentTransformer","trimResultTransformer","replaceSubstitutionTransformer","TemplateTag","replaceResultTransformer","trimResultTransformer","TemplateTag","replaceResultTransformer","trimResultTransformer","TemplateTag","inlineArrayTransformer","replaceResultTransformer","trimResultTransformer","TemplateTag","inlineArrayTransformer","replaceResultTransformer","trimResultTransformer","TemplateTag","inlineArrayTransformer","replaceResultTransformer","trimResultTransformer","TemplateTag","inlineArrayTransformer","stripIndentTransformer","trimResultTransformer","TemplateTag","inlineArrayTransformer","replaceResultTransformer","trimResultTransformer","TemplateTag","stripIndentTransformer","trimResultTransformer","TemplateTag","stripIndentTransformer","trimResultTransformer","LineageView","statusIcon: IconComponent | IconType | undefined","statusColor: string | undefined","getIconForChangeStatus","selectedNodes: LineageGraphNode[]","changedNodes: string[]","addedNodes: string[]","removedNodes: string[]","changedNodes","error","node","RunResultView: RegistryEntry[\"RunResultView\"] | undefined","check","error","checkTypeIcon: IconComponent | undefined","MuiTooltip","LineageDiffView","SqlEditor","CheckTimeline","CheckEmptyStateUI","prefix","invariant","getRect","expand","shrink","shift","noSpacing","createBox","parse","invariant","getWindowScroll","offset","withScroll","scroll","calculateBox","getBox","rafSchd","wrapperFn","shared","start","combine","update","useMemo","useCallback","droppable","isEqual","draggable","withDroppableDisplacement","newIndex","closest","withDroppableScroll","offset","distance","getDisplacedBy","subject","home","withMaxScroll","rafSchd","isActive","execute","add","flush","drop","createStore","createStore$1","scroll","updateDroppableIsEnabled","updateDroppableIsCombineEnabled","updateDroppableScroll","scrollDroppable","change","scrollWindow","getSelector","register","tryGiveFocus","tryShiftRecord","tryRestoreFocusRecorded","tryRecordFocus","clean","prefix","listenForCapture","bindCapturingEvents","startPendingDrag","getPhase","setPhase","startDragging","lift","finish","tryAbandonLock","tryReleaseLock","dragHandleUsageInstructions","isDragging","getDimension","style","isMovementAllowed","updateViewportMaxScroll","snapshot","onDragEnd","Droppable","Draggable","style","provided","offset","checkId","error","CheckEmptyState","CheckList","CheckDetail","NODE_CHANGE_STATUS_MSGS: Record<\n NonNullable<ChangeStatus>,\n [string, string]\n>","MuiTooltip","ResourceTypeTag","changedNodes: LineageGraphNode[]","error"],"sources":["../src/providers/contexts/RoutingContext.tsx","../src/providers/RecceProvider.tsx","../src/components/lineage/controls/ActionControl.tsx","../src/components/lineage/controls/ColumnLevelLineageControl.tsx","../src/components/lineage/ActionControlOss.tsx","../src/components/lineage/ColumnLevelLineageControlOss.tsx","../src/components/lineage/GraphColumnNodeOss.tsx","../src/components/lineage/edges/GraphEdge.tsx","../src/components/lineage/GraphEdgeOss.tsx","../src/components/lineage/nodes/ActionTag.tsx","../src/components/check/timeline/TimelineEventOss.tsx","../src/components/check/timeline/CheckTimelineOss.tsx","../src/components/ui/SquareIcon.tsx","../src/components/query/QueryForm.tsx","../src/components/query/SetupConnectionGuide.tsx","../src/components/query/QueryPageOss.tsx","../src/components/lineage/GraphNodeOss.tsx","../src/components/lineage/config/nodeTypes.ts","../src/components/lineage/contextmenu/LineageViewContextMenu.tsx","../src/components/lineage/hooks/useLineageCopyToClipboard.ts","../src/components/lineage/hooks/useNavToCheck.ts","../src/components/lineage/hooks/useResizeObserver.ts","../src/components/lineage/hooks/useTrackLineageRender.ts","../src/hooks/useMultiNodesActionOss.ts","../src/hooks/useValueDiffAlertDialogOss.tsx","../src/components/notifications/LineageViewNotification.tsx","../src/components/lineage/LineageViewContextMenuOss.tsx","../../../node_modules/.pnpm/@dagrejs+graphlib@2.2.4/node_modules/@dagrejs/graphlib/lib/graph.js","../../../node_modules/.pnpm/@dagrejs+graphlib@2.2.4/node_modules/@dagrejs/graphlib/lib/version.js","../../../node_modules/.pnpm/@dagrejs+graphlib@2.2.4/node_modules/@dagrejs/graphlib/lib/index.js","../../../node_modules/.pnpm/@dagrejs+graphlib@2.2.4/node_modules/@dagrejs/graphlib/lib/json.js","../../../node_modules/.pnpm/@dagrejs+graphlib@2.2.4/node_modules/@dagrejs/graphlib/lib/alg/components.js","../../../node_modules/.pnpm/@dagrejs+graphlib@2.2.4/node_modules/@dagrejs/graphlib/lib/data/priority-queue.js","../../../node_modules/.pnpm/@dagrejs+graphlib@2.2.4/node_modules/@dagrejs/graphlib/lib/alg/dijkstra.js","../../../node_modules/.pnpm/@dagrejs+graphlib@2.2.4/node_modules/@dagrejs/graphlib/lib/alg/dijkstra-all.js","../../../node_modules/.pnpm/@dagrejs+graphlib@2.2.4/node_modules/@dagrejs/graphlib/lib/alg/tarjan.js","../../../node_modules/.pnpm/@dagrejs+graphlib@2.2.4/node_modules/@dagrejs/graphlib/lib/alg/find-cycles.js","../../../node_modules/.pnpm/@dagrejs+graphlib@2.2.4/node_modules/@dagrejs/graphlib/lib/alg/floyd-warshall.js","../../../node_modules/.pnpm/@dagrejs+graphlib@2.2.4/node_modules/@dagrejs/graphlib/lib/alg/topsort.js","../../../node_modules/.pnpm/@dagrejs+graphlib@2.2.4/node_modules/@dagrejs/graphlib/lib/alg/is-acyclic.js","../../../node_modules/.pnpm/@dagrejs+graphlib@2.2.4/node_modules/@dagrejs/graphlib/lib/alg/dfs.js","../../../node_modules/.pnpm/@dagrejs+graphlib@2.2.4/node_modules/@dagrejs/graphlib/lib/alg/postorder.js","../../../node_modules/.pnpm/@dagrejs+graphlib@2.2.4/node_modules/@dagrejs/graphlib/lib/alg/preorder.js","../../../node_modules/.pnpm/@dagrejs+graphlib@2.2.4/node_modules/@dagrejs/graphlib/lib/alg/prim.js","../../../node_modules/.pnpm/@dagrejs+graphlib@2.2.4/node_modules/@dagrejs/graphlib/lib/alg/index.js","../../../node_modules/.pnpm/@dagrejs+graphlib@2.2.4/node_modules/@dagrejs/graphlib/index.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/data/list.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/greedy-fas.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/util.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/acyclic.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/normalize.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/rank/util.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/rank/feasible-tree.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/rank/network-simplex.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/rank/index.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/parent-dummy-chains.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/nesting-graph.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/add-border-segments.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/coordinate-system.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/order/init-order.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/order/cross-count.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/order/barycenter.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/order/resolve-conflicts.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/order/sort.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/order/sort-subgraph.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/order/build-layer-graph.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/order/add-subgraph-constraints.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/order/index.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/position/bk.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/position/index.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/layout.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/debug.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/lib/version.js","../../../node_modules/.pnpm/@dagrejs+dagre@1.1.8/node_modules/@dagrejs/dagre/index.js","../src/components/lineage/lineage.ts","../src/components/schema/SchemaView.tsx","../src/components/lineage/NodeSqlView.tsx","../src/components/lineage/NodeSqlViewOss.tsx","../src/components/lineage/tags/tagStyles.ts","../src/components/lineage/tags/ResourceTypeTag.tsx","../src/components/lineage/NodeTag.tsx","../src/components/lineage/NodeView.tsx","../src/components/lineage/SandboxView.tsx","../src/components/lineage/SandboxViewOss.tsx","../src/components/lineage/NodeViewOss.tsx","../src/components/lineage/SetupConnectionBanner.tsx","../src/components/lineage/SetupConnectionBannerOss.tsx","../src/components/lineage/SingleEnvironmentQueryView.tsx","../src/components/lineage/states/LineageViewStates.tsx","../src/components/shared/HistoryToggle.tsx","../src/components/lineage/topbar/LineageViewTopBar.tsx","../src/components/lineage/topbar/LineageViewTopBarOss.tsx","../src/components/lineage/LineageViewOss.tsx","../src/components/lineage/LineagePageOss.tsx","../src/components/app/AvatarDropdown.tsx","../src/components/app/DisplayModeToggleOss.tsx","../src/components/app/EnvInfo.tsx","../src/components/app/Filename.tsx","../src/components/app/StateExporter.tsx","../src/components/app/StateSharing.tsx","../src/components/app/StateSynchronizer.tsx","../src/components/app/NavBarOss.tsx","../src/components/timeout/IdleTimeoutBadge.tsx","../src/components/app/RecceVersionBadgeOss.tsx","../src/components/app/TopBarOss.tsx","../src/components/app/MainLayout.tsx","../src/components/app/SetupConnectionPopover.tsx","../src/components/app/StateImporter.tsx","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/TemplateTag/TemplateTag.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/trimResultTransformer/trimResultTransformer.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/stripIndentTransformer/stripIndentTransformer.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/replaceResultTransformer/replaceResultTransformer.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/replaceSubstitutionTransformer/replaceSubstitutionTransformer.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/inlineArrayTransformer/inlineArrayTransformer.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/splitStringTransformer/splitStringTransformer.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/removeNonPrintingValuesTransformer/removeNonPrintingValuesTransformer.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/commaLists/commaLists.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/commaListsAnd/commaListsAnd.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/commaListsOr/commaListsOr.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/html/html.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/safeHtml/safeHtml.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/oneLine/oneLine.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/oneLineTrim/oneLineTrim.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/oneLineCommaLists/oneLineCommaLists.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/oneLineCommaListsOr/oneLineCommaListsOr.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/oneLineCommaListsAnd/oneLineCommaListsAnd.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/inlineLists/inlineLists.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/oneLineInlineLists/oneLineInlineLists.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/stripIndent/stripIndent.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/stripIndents/stripIndents.js","../src/components/check/LineageDiffViewOss.tsx","../src/components/check/SchemaDiffView.tsx","../src/components/check/CheckDetailOss.tsx","../src/components/check/CheckEmptyStateOss.tsx","../../../node_modules/.pnpm/tiny-invariant@1.3.3/node_modules/tiny-invariant/dist/esm/tiny-invariant.js","../../../node_modules/.pnpm/css-box-model@1.2.1/node_modules/css-box-model/dist/css-box-model.esm.js","../../../node_modules/.pnpm/raf-schd@4.0.3/node_modules/raf-schd/dist/raf-schd.esm.js","../../../node_modules/.pnpm/@hello-pangea+dnd@18.0.1_@types+react@19.2.9_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@hello-pangea/dnd/dist/dnd.esm.js","../src/components/check/CheckListOss.tsx","../src/components/check/CheckPageContentOss.tsx","../src/components/check/CheckPageLoadingOss.tsx","../src/components/summary/types.ts","../src/components/summary/utils.ts","../src/components/summary/ChangeSummary.tsx","../src/components/summary/SchemaSummary.tsx","../src/components/views/ChecksView.tsx","../src/index.ts"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useMemo,\n} from \"react\";\n\n/**\n * Navigation options for route changes\n */\nexport interface NavigateOptions {\n /** Replace current history entry instead of pushing */\n replace?: boolean;\n /** Scroll to top after navigation (default: true) */\n scroll?: boolean;\n}\n\n/**\n * Configuration for the routing provider\n */\nexport interface RoutingConfig {\n /** Base path prefix for all routes */\n basePath?: string;\n\n /**\n * Current pathname (provided by consumer's router)\n * If not provided, defaults to empty string\n */\n pathname?: string;\n\n /**\n * Navigation handler (provided by consumer's router)\n * Called when components need to navigate programmatically\n *\n * @example\n * ```tsx\n * // Next.js App Router\n * const router = useRouter();\n * <RecceProvider\n * routing={{\n * pathname: usePathname(),\n * onNavigate: (path, options) => {\n * options?.replace ? router.replace(path) : router.push(path);\n * }\n * }}\n * />\n * ```\n */\n onNavigate?: (path: string, options?: NavigateOptions) => void;\n}\n\n/**\n * Routing context value available to consumers\n */\nexport interface RoutingContextValue {\n /** Base path prefix */\n basePath: string;\n /** Build a full path with base path prefix */\n buildPath: (path: string) => string;\n /** Current pathname (if provided by consumer) */\n pathname: string;\n /** Navigate to a path */\n navigate: (path: string, options?: NavigateOptions) => void;\n}\n\nconst RoutingContext = createContext<RoutingContextValue | null>(null);\nRoutingContext.displayName = \"RecceRoutingContext\";\n\n/**\n * Hook to access routing context\n *\n * @returns Routing context with path utilities and navigation\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { pathname, navigate, buildPath } = useRouting();\n *\n * return (\n * <button onClick={() => navigate(buildPath('/checks'))}>\n * Go to Checks\n * </button>\n * );\n * }\n * ```\n */\nexport function useRouting(): RoutingContextValue {\n const context = useContext(RoutingContext);\n if (!context) {\n // Return sensible defaults if not within provider\n return {\n basePath: \"\",\n buildPath: (path: string) => path,\n pathname: \"\",\n navigate: (path: string) => {\n // Fallback: use window.location for navigation\n if (typeof window !== \"undefined\") {\n window.location.href = path;\n }\n },\n };\n }\n return context;\n}\n\n/**\n * Hook compatible with useAppLocation API\n *\n * Returns a tuple of [pathname, setLocation] for easy migration from\n * the OSS useAppLocation hook.\n *\n * @returns [pathname, navigate] tuple\n *\n * @example\n * ```tsx\n * const [location, setLocation] = useAppLocation();\n * setLocation('/checks?id=123');\n * setLocation('/checks', { replace: true });\n * ```\n */\nexport function useAppLocation(): [\n string,\n (path: string, options?: NavigateOptions) => void,\n] {\n const { pathname, navigate } = useRouting();\n return [pathname, navigate];\n}\n\ninterface RoutingProviderProps {\n children: ReactNode;\n config?: RoutingConfig;\n}\n\nexport function RoutingProvider({ children, config }: RoutingProviderProps) {\n const basePath = config?.basePath ?? \"\";\n const pathname = config?.pathname ?? \"\";\n const onNavigate = config?.onNavigate;\n\n const buildPath = useCallback(\n (path: string) => {\n if (!basePath) return path;\n return `${basePath}${path.startsWith(\"/\") ? path : `/${path}`}`;\n },\n [basePath],\n );\n\n const navigate = useCallback(\n (path: string, options?: NavigateOptions) => {\n if (onNavigate) {\n onNavigate(path, options);\n } else if (typeof window !== \"undefined\") {\n // Fallback: use window.location\n if (options?.replace) {\n window.history.replaceState(null, \"\", path);\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n } else {\n window.location.href = path;\n }\n }\n },\n [onNavigate],\n );\n\n const value = useMemo<RoutingContextValue>(\n () => ({\n basePath,\n buildPath,\n pathname,\n navigate,\n }),\n [basePath, buildPath, pathname, navigate],\n );\n\n return (\n <RoutingContext.Provider value={value}>{children}</RoutingContext.Provider>\n );\n}\n","\"use client\";\n\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport type { AxiosInstance } from \"axios\";\nimport { type ReactNode, useMemo } from \"react\";\n\nimport type { RecceActionProviderProps } from \"../contexts/action\";\nimport { RecceActionProvider } from \"../contexts/action\";\nimport { IdleTimeoutProvider } from \"../contexts/idle\";\nimport { RecceInstanceInfoProvider } from \"../contexts/instance\";\nimport type { LineageGraphProviderProps } from \"../contexts/lineage\";\nimport { LineageGraphProvider } from \"../contexts/lineage\";\nimport { ApiProvider } from \"./contexts/ApiContext\";\nimport type { Check, CheckProviderProps } from \"./contexts/CheckContext\";\nimport { CheckProvider } from \"./contexts/CheckContext\";\nimport type { QueryProviderProps, QueryResult } from \"./contexts/QueryContext\";\nimport { QueryProvider } from \"./contexts/QueryContext\";\nimport { RoutingProvider } from \"./contexts/RoutingContext\";\nimport { ThemeProvider } from \"./contexts/ThemeContext\";\n\n/**\n * Theme mode selection for RecceProvider.\n */\ntype ThemeMode = \"light\" | \"dark\" | \"system\";\n\n/**\n * Props for {@link RecceProvider}.\n */\ninterface RecceProviderProps {\n children: ReactNode;\n\n /**\n * API configuration - simple config OR custom client.\n */\n api:\n | {\n baseUrl: string;\n headers?: Record<string, string>;\n timeout?: number;\n }\n | {\n client: AxiosInstance;\n };\n\n /**\n * Theme mode.\n *\n * @defaultValue \"system\"\n */\n theme?: ThemeMode;\n\n /**\n * Routing configuration\n *\n * @example\n * ```tsx\n * // With Next.js App Router\n * const router = useRouter();\n * const pathname = usePathname();\n *\n * <RecceProvider\n * routing={{\n * basePath: '/app',\n * pathname,\n * onNavigate: (path, options) => {\n * options?.replace ? router.replace(path) : router.push(path);\n * }\n * }}\n * />\n * ```\n */\n routing?: {\n basePath?: string;\n pathname?: string;\n onNavigate?: (\n path: string,\n options?: { replace?: boolean; scroll?: boolean },\n ) => void;\n };\n\n /**\n * TanStack Query client configuration.\n */\n queryClient?: {\n staleTime?: number;\n gcTime?: number;\n };\n\n /**\n * Run action configuration\n * Props for RecceActionProvider - manages run execution and result display\n */\n runActions?: {\n /** Handler called when a run action is requested */\n onRunAction?: RecceActionProviderProps[\"onRunAction\"];\n /** Handler called when a run result should be shown */\n onShowRunId?: RecceActionProviderProps[\"onShowRunId\"];\n /** Initial run ID to display */\n initialRunId?: string;\n /** Initial state for history panel */\n initialHistoryOpen?: boolean;\n };\n\n /**\n * Lineage graph configuration\n * Props for LineageGraphProvider - manages lineage visualization\n */\n lineage?: {\n /** The processed lineage graph data */\n lineageGraph?: LineageGraphProviderProps[\"lineageGraph\"];\n /** Environment information (git, dbt, sqlmesh metadata) */\n envInfo?: LineageGraphProviderProps[\"envInfo\"];\n /** Whether in review mode (read-only checks) */\n reviewMode?: boolean;\n /** Whether in cloud mode (recce cloud) */\n cloudMode?: boolean;\n /** Whether in file mode (loading from file) */\n fileMode?: boolean;\n /** The state file name if in file mode */\n fileName?: string;\n /** Whether this is the demo site */\n isDemoSite?: boolean;\n /** Whether running in GitHub Codespace */\n isCodespace?: boolean;\n /** Loading state */\n isLoading?: boolean;\n /** Error message if loading failed */\n error?: string;\n /** Supported task types from server */\n supportTasks?: Record<string, boolean>;\n /** Callback to refetch the lineage graph */\n onRefetchLineageGraph?: () => void;\n /** Pre-aggregated run results by model */\n runsAggregated?: LineageGraphProviderProps[\"runsAggregated\"];\n /** Callback to refetch aggregated runs */\n onRefetchRunsAggregated?: () => void;\n };\n\n /**\n * Check management configuration\n * Props for CheckProvider - manages check CRUD operations\n */\n checks?: {\n /** List of checks */\n checks?: Check[];\n /** Loading state */\n isLoading?: boolean;\n /** Error message */\n error?: string;\n /** Currently selected check ID */\n selectedCheckId?: string;\n /** Handler for check selection */\n onSelectCheck?: CheckProviderProps[\"onSelectCheck\"];\n /** Handler for check creation */\n onCreateCheck?: CheckProviderProps[\"onCreateCheck\"];\n /** Handler for check updates */\n onUpdateCheck?: CheckProviderProps[\"onUpdateCheck\"];\n /** Handler for check deletion */\n onDeleteCheck?: CheckProviderProps[\"onDeleteCheck\"];\n /** Handler for check reordering */\n onReorderChecks?: CheckProviderProps[\"onReorderChecks\"];\n /** Callback to refetch checks */\n refetchChecks?: () => void;\n };\n\n /**\n * Query editor configuration\n * Props for QueryProvider - manages SQL query execution\n */\n query?: {\n /** Current SQL query */\n sql?: string;\n /** Whether query is executing */\n isExecuting?: boolean;\n /** Error message */\n error?: string;\n /** Query result for base environment */\n baseResult?: QueryResult;\n /** Query result for current environment */\n currentResult?: QueryResult;\n /** Handler for SQL changes */\n onSqlChange?: QueryProviderProps[\"onSqlChange\"];\n /** Handler for query execution */\n onExecute?: QueryProviderProps[\"onExecute\"];\n /** Handler for query cancellation */\n onCancel?: QueryProviderProps[\"onCancel\"];\n };\n\n /**\n * Feature flags - control which contexts are enabled\n * Set to false to skip a context entirely (reduces overhead if unused)\n */\n features?: {\n /** Enable RecceInstanceInfoProvider (instance info and feature toggles) */\n enableInstance?: boolean;\n /** Enable IdleTimeoutProvider (session timeout and keep-alive) */\n enableIdleTimeout?: boolean;\n /** Enable LineageGraphProvider (lineage visualization) */\n enableLineage?: boolean;\n /** Enable RecceActionProvider (run execution) */\n enableRunActions?: boolean;\n /** Enable CheckProvider (check management) */\n enableChecks?: boolean;\n /** Enable QueryProvider (SQL query editor) */\n enableQuery?: boolean;\n };\n}\n\n// Create a default query client\nconst createDefaultQueryClient = (\n options?: RecceProviderProps[\"queryClient\"],\n) =>\n new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: options?.staleTime ?? 1000 * 60, // 1 minute\n gcTime: options?.gcTime ?? 1000 * 60 * 5, // 5 minutes\n retry: 1,\n refetchOnWindowFocus: false,\n },\n },\n });\n\n/**\n * RecceProvider - The single entry point for @datarecce/ui\n *\n * This provider orchestrates ALL Recce contexts in the correct order.\n * It follows a props-driven design - pass your data and callbacks, no internal fetching.\n *\n * **Architecture:**\n * - Foundation layer: QueryClient → API → Theme → Routing\n * - Data layer: Instance → Idle → Lineage → RunActions\n * - UI layer: Checks → Query\n *\n * **Feature Flags:**\n * Use `features` prop to disable unused contexts and reduce overhead.\n *\n * @example\n * ```tsx\n * // Minimal setup (only API + Theme)\n * <RecceProvider api={{ baseUrl: \"/api\" }}>\n * <MyApp />\n * </RecceProvider>\n *\n * // Full setup with all features\n * <RecceProvider\n * api={{ baseUrl: \"/api\" }}\n * theme=\"dark\"\n * lineage={{\n * lineageGraph: data.lineageGraph,\n * envInfo: data.envInfo,\n * onRefetchLineageGraph: refetch,\n * }}\n * runActions={{\n * onRunAction: handleRunAction,\n * onShowRunId: handleShowRun,\n * }}\n * checks={{\n * checks: checksData,\n * onCreateCheck: createCheck,\n * onUpdateCheck: updateCheck,\n * }}\n * features={{\n * enableLineage: true,\n * enableRunActions: true,\n * enableChecks: true,\n * }}\n * >\n * <MyApp />\n * </RecceProvider>\n * ```\n */\nexport function RecceProvider({\n children,\n api,\n theme = \"system\",\n routing,\n queryClient: queryClientConfig,\n runActions,\n lineage,\n checks,\n query,\n features = {},\n}: RecceProviderProps) {\n // Extract primitive values to stabilize dependency and prevent unnecessary QueryClient recreation\n const staleTime = queryClientConfig?.staleTime;\n const gcTime = queryClientConfig?.gcTime;\n\n const queryClient = useMemo(\n () =>\n createDefaultQueryClient({\n staleTime,\n gcTime,\n }),\n [staleTime, gcTime],\n );\n\n // Default all features to true unless explicitly disabled\n const {\n enableInstance = true,\n enableIdleTimeout = true,\n enableLineage = true,\n enableRunActions = true,\n enableChecks = true,\n enableQuery = true,\n } = features;\n\n // Foundation layer: QueryClient → API → Theme → Routing\n let tree = children;\n\n // Wrap with Routing (innermost of foundation layer)\n tree = <RoutingProvider config={routing}>{tree}</RoutingProvider>;\n\n // Wrap with Theme\n tree = <ThemeProvider defaultMode={theme}>{tree}</ThemeProvider>;\n\n // Wrap with API\n tree = <ApiProvider config={api}>{tree}</ApiProvider>;\n\n // Wrap with QueryClient (outermost of foundation layer)\n tree = <QueryClientProvider client={queryClient}>{tree}</QueryClientProvider>;\n\n // Data layer: Instance → Idle → Lineage → RunActions\n // These are wrapped in reverse order (bottom-up)\n\n // UI layer: Query (innermost)\n if (enableQuery) {\n tree = (\n <QueryProvider\n sql={query?.sql}\n isExecuting={query?.isExecuting}\n error={query?.error}\n baseResult={query?.baseResult}\n currentResult={query?.currentResult}\n onSqlChange={query?.onSqlChange}\n onExecute={query?.onExecute}\n onCancel={query?.onCancel}\n >\n {tree}\n </QueryProvider>\n );\n }\n\n // UI layer: Checks\n if (enableChecks) {\n tree = (\n <CheckProvider\n checks={checks?.checks}\n isLoading={checks?.isLoading}\n error={checks?.error}\n selectedCheckId={checks?.selectedCheckId}\n onSelectCheck={checks?.onSelectCheck}\n onCreateCheck={checks?.onCreateCheck}\n onUpdateCheck={checks?.onUpdateCheck}\n onDeleteCheck={checks?.onDeleteCheck}\n onReorderChecks={checks?.onReorderChecks}\n refetchChecks={checks?.refetchChecks}\n >\n {tree}\n </CheckProvider>\n );\n }\n\n // Data layer: RunActions\n if (enableRunActions) {\n tree = (\n <RecceActionProvider\n onRunAction={runActions?.onRunAction}\n onShowRunId={runActions?.onShowRunId}\n initialRunId={runActions?.initialRunId}\n initialHistoryOpen={runActions?.initialHistoryOpen}\n >\n {tree}\n </RecceActionProvider>\n );\n }\n\n // Data layer: Lineage\n if (enableLineage) {\n tree = (\n <LineageGraphProvider\n lineageGraph={lineage?.lineageGraph}\n envInfo={lineage?.envInfo}\n reviewMode={lineage?.reviewMode}\n cloudMode={lineage?.cloudMode}\n fileMode={lineage?.fileMode}\n fileName={lineage?.fileName}\n isDemoSite={lineage?.isDemoSite}\n isCodespace={lineage?.isCodespace}\n isLoading={lineage?.isLoading}\n error={lineage?.error}\n supportTasks={lineage?.supportTasks}\n onRefetchLineageGraph={lineage?.onRefetchLineageGraph}\n runsAggregated={lineage?.runsAggregated}\n onRefetchRunsAggregated={lineage?.onRefetchRunsAggregated}\n >\n {tree}\n </LineageGraphProvider>\n );\n }\n\n // Data layer: Idle (depends on Instance for idle timeout config)\n if (enableIdleTimeout) {\n tree = <IdleTimeoutProvider>{tree}</IdleTimeoutProvider>;\n }\n\n // Data layer: Instance (outermost, provides feature toggles for all others)\n if (enableInstance) {\n tree = <RecceInstanceInfoProvider>{tree}</RecceInstanceInfoProvider>;\n }\n\n return tree;\n}\n\nexport type { RecceProviderProps };\n","\"use client\";\n\nimport Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Divider from \"@mui/material/Divider\";\nimport Stack from \"@mui/material/Stack\";\nimport type { ActionState } from \"../../../contexts/lineage/types\";\n\n/**\n * Props for the ActionControl component.\n */\nexport interface ActionControlProps {\n /**\n * The current action state containing progress, status, and mode information\n */\n actionState: ActionState;\n\n /**\n * Callback invoked when the user clicks the Cancel button\n */\n onCancel: () => void;\n\n /**\n * Callback invoked when the user clicks the Close button (after action completes)\n */\n onClose: () => void;\n}\n\n/**\n * ActionControl Component\n *\n * Displays progress information and control buttons for batch operations\n * on lineage graph nodes. Shows different UI based on action status:\n * - Running/Canceling: Shows progress with Cancel button\n * - Completed/Canceled: Shows progress with Close button\n *\n * This is a props-based component that doesn't use context directly.\n * For context-aware usage, wrap this component with context consumers.\n *\n * @example Basic usage\n * ```tsx\n * import { ActionControl } from '@datarecce/ui/components/lineage';\n *\n * function MyComponent() {\n * const [actionState, setActionState] = useState<ActionState>({\n * mode: 'per_node',\n * status: 'running',\n * completed: 5,\n * total: 10,\n * actions: {},\n * });\n *\n * return (\n * <ActionControl\n * actionState={actionState}\n * onCancel={() => setActionState(prev => ({ ...prev, status: 'canceling' }))}\n * onClose={() => console.log('closed')}\n * />\n * );\n * }\n * ```\n *\n * @example With context wrapper (OSS pattern)\n * ```tsx\n * import { ActionControl as BaseActionControl } from '@datarecce/ui/components/lineage';\n * import { useLineageViewContext } from './LineageViewContext';\n *\n * function ActionControl({ onClose }: { onClose: () => void }) {\n * const { cancel, actionState } = useLineageViewContext();\n * return <BaseActionControl actionState={actionState} onCancel={cancel} onClose={onClose} />;\n * }\n * ```\n */\nexport function ActionControl({\n actionState,\n onCancel,\n onClose,\n}: ActionControlProps) {\n /**\n * Calculate the progress message based on action mode and status\n */\n const getProgressMessage = () => {\n if (actionState.mode === \"per_node\") {\n return `${actionState.completed} / ${actionState.total}`;\n }\n // multi_nodes mode\n if (actionState.currentRun?.progress?.percentage) {\n return `${actionState.currentRun.progress.percentage * 100}%`;\n }\n if (actionState.status === \"completed\") {\n return \"100%\";\n }\n return \"0%\";\n };\n\n const isActionInProgress =\n actionState.status === \"running\" || actionState.status === \"canceling\";\n\n return (\n <Box sx={{ bgcolor: \"background.paper\", borderRadius: 1, boxShadow: 6 }}>\n <Stack\n direction=\"row\"\n divider={<Divider orientation=\"vertical\" flexItem />}\n spacing={2}\n sx={{ p: \"5px 15px\", mt: 2 }}\n >\n <Box sx={{ fontSize: \"10pt\" }}>\n Progress: {getProgressMessage()}{\" \"}\n {actionState.status === \"canceled\" ? \" (canceled)\" : \"\"}\n </Box>\n\n {isActionInProgress ? (\n <Button\n size=\"small\"\n variant=\"outlined\"\n onClick={onCancel}\n disabled={actionState.status === \"canceling\"}\n >\n {actionState.status === \"canceling\" ? \"Canceling\" : \"Cancel\"}\n </Button>\n ) : (\n <Stack direction=\"row\">\n <Button size=\"small\" variant=\"outlined\" onClick={onClose}>\n Close\n </Button>\n </Stack>\n )}\n </Stack>\n </Box>\n );\n}\n","\"use client\";\n\n/**\n * @file ColumnLevelLineageControl.tsx\n * @description Control panel for Column-Level Lineage (CLL) and Impact Radius features.\n *\n * This component provides:\n * - Impact Radius button to analyze downstream impact of changes\n * - Mode message panel showing current CLL context\n * - Loading and error states for CLL operations\n * - Reset button to exit CLL mode\n *\n * @example\n * ```tsx\n * <ColumnLevelLineageControl\n * action={cllMutation}\n * interactive={true}\n * viewOptions={viewOptions}\n * lineageGraph={lineageGraph}\n * singleEnvMode={false}\n * onShowCll={(params) => showColumnLevelLineage(params)}\n * onResetCll={() => resetColumnLevelLineage()}\n * onCenterNode={(nodeId) => centerNode(nodeId)}\n * />\n * ```\n */\n\nimport Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Link from \"@mui/material/Link\";\nimport MuiPopover from \"@mui/material/Popover\";\nimport Stack from \"@mui/material/Stack\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport type { UseMutationResult } from \"@tanstack/react-query\";\nimport { useState } from \"react\";\nimport { FaRegDotCircle } from \"react-icons/fa\";\nimport { PiInfo, PiX } from \"react-icons/pi\";\nimport type { CllInput, ColumnLineageData } from \"../../../api/cll\";\nimport type { LineageDiffViewOptions } from \"../../../api/lineagecheck\";\nimport type { LineageGraph } from \"../../../contexts/lineage/types\";\nimport { useIsDark } from \"../../../hooks/useIsDark\";\n\n/**\n * Props for the ColumnLevelLineageControl component.\n */\nexport interface ColumnLevelLineageControlProps {\n /**\n * Mutation result for CLL operations.\n * Used to track loading, error, and success states.\n */\n action: UseMutationResult<ColumnLineageData, Error, CllInput>;\n\n /**\n * Whether the view is interactive (allows user actions).\n * When false, buttons are disabled.\n */\n interactive: boolean;\n\n /**\n * Current view options including column_level_lineage settings.\n */\n viewOptions: LineageDiffViewOptions;\n\n /**\n * The lineage graph data containing nodes and catalog metadata.\n * Used to determine node names and catalog availability.\n */\n lineageGraph?: LineageGraph;\n\n /**\n * Whether in single environment mode.\n * When true, the Impact Radius button is hidden.\n */\n singleEnvMode?: boolean;\n\n /**\n * Callback to show column-level lineage.\n * Called with CLL parameters when Impact Radius button is clicked.\n */\n onShowCll: (params?: CllInput) => Promise<void>;\n\n /**\n * Callback to reset column-level lineage view.\n */\n onResetCll: () => Promise<void>;\n\n /**\n * Callback to center the view on a specific node.\n */\n onCenterNode: (nodeId: string) => void;\n}\n\n/**\n * Internal component to display mode-specific messages.\n * Shows what CLL context is currently active.\n */\nconst ModeMessage = ({\n lineageGraph,\n cllInput,\n onCenterNode,\n}: {\n lineageGraph?: LineageGraph;\n cllInput?: CllInput;\n onCenterNode: (nodeId: string) => void;\n}) => {\n const isDark = useIsDark();\n\n const codeBlockSx = {\n cursor: \"pointer\",\n fontFamily: \"monospace\",\n bgcolor: isDark ? \"grey.700\" : \"grey.100\",\n px: 0.5,\n borderRadius: 0.5,\n };\n\n if (!lineageGraph) {\n return <></>;\n }\n\n if (!cllInput) {\n return <>Default View</>;\n }\n\n if (cllInput.node_id === undefined) {\n return (\n <Typography component=\"span\">\n Impact Radius for All Changed Models\n </Typography>\n );\n }\n\n const nodeName =\n cllInput.node_id in lineageGraph.nodes\n ? lineageGraph.nodes[cllInput.node_id].data.name\n : cllInput.node_id;\n\n if (!cllInput.column) {\n const nodeId = cllInput.node_id;\n\n return (\n <>\n <Typography component=\"span\" sx={{ mr: \"5px\" }}>\n Impact Radius for\n </Typography>\n <Box\n component=\"code\"\n onClick={() => {\n onCenterNode(nodeId);\n }}\n sx={codeBlockSx}\n >\n {nodeName}\n </Box>\n </>\n );\n }\n const nodeId = `${cllInput.node_id}_${cllInput.column}`;\n return (\n <>\n <Typography component=\"span\" sx={{ mr: \"5px\" }}>\n Column Lineage for{\" \"}\n </Typography>\n <Box\n component=\"code\"\n onClick={() => {\n onCenterNode(nodeId);\n }}\n sx={codeBlockSx}\n >\n {nodeName}.{cllInput.column}\n </Box>\n </>\n );\n};\n\n/**\n * Control panel for Column-Level Lineage (CLL) and Impact Radius features.\n *\n * Features:\n * - **Impact Radius Button**: Triggers analysis of downstream impact for changed models\n * - **Mode Message Panel**: Shows current CLL context (node, column, or all changes)\n * - **Loading State**: Displays spinner during CLL operations\n * - **Error State**: Shows error indicator with tooltip for failure details\n * - **Reset Button**: Allows exiting CLL mode to return to default view\n *\n * The component is designed for dependency injection, receiving all callbacks\n * and state as props to enable reuse across different contexts.\n */\nexport const ColumnLevelLineageControl = ({\n action,\n interactive,\n viewOptions,\n lineageGraph,\n singleEnvMode = false,\n onShowCll,\n onResetCll,\n onCenterNode,\n}: ColumnLevelLineageControlProps) => {\n const cllInput = viewOptions.column_level_lineage;\n const noCatalogCurrent = !lineageGraph?.catalogMetadata.current;\n\n return (\n <Stack direction=\"row\" spacing=\"5px\">\n {!singleEnvMode && (\n <Box sx={{ borderRadius: 1, boxShadow: 3 }}>\n <MuiTooltip\n enterDelay={50}\n title={\n noCatalogCurrent\n ? \"Please provide catalog.json to enable Impact Radius\"\n : \"\"\n }\n placement=\"top\"\n >\n <span>\n <Button\n size=\"small\"\n variant=\"outlined\"\n color=\"neutral\"\n sx={{\n whiteSpace: \"nowrap\",\n display: \"inline-flex\",\n bgcolor: \"background.paper\",\n }}\n disabled={!interactive || noCatalogCurrent}\n startIcon={<FaRegDotCircle />}\n onClick={() => {\n void onShowCll({\n no_upstream: true,\n change_analysis: true,\n });\n }}\n >\n Impact Radius\n </Button>\n </span>\n </MuiTooltip>\n </Box>\n )}\n {cllInput && (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n sx={{\n borderRadius: 1,\n boxShadow: 3,\n border: \"1px solid\",\n borderColor: \"divider\",\n bgcolor: \"background.paper\",\n fontSize: \"0.8rem\",\n p: \"0 0.625rem\",\n }}\n >\n <ModeMessage\n lineageGraph={lineageGraph}\n cllInput={cllInput}\n onCenterNode={onCenterNode}\n />\n {action.isError && (\n <MuiTooltip\n title={`Error: ${action.error.message}`}\n placement=\"bottom\"\n >\n <Typography\n component=\"span\"\n sx={{\n color: \"error.main\",\n ml: \"2px\",\n display: \"inline-flex\",\n alignItems: \"center\",\n }}\n >\n <Box\n component={PiInfo}\n sx={{ color: \"error.main\", fontSize: \"14px\" }}\n />\n </Typography>\n </MuiTooltip>\n )}\n\n {action.isPending ? (\n <CircularProgress size={12} sx={{ ml: \"2px\" }} />\n ) : (\n <IconButton\n size=\"small\"\n sx={{ ml: \"2px\" }}\n aria-label=\"Reset Column Level Lineage\"\n onClick={() => {\n void onResetCll();\n }}\n >\n <PiX size=\"10px\" />\n </IconButton>\n )}\n </Stack>\n )}\n </Stack>\n );\n};\n","\"use client\";\n\n/**\n * @file ActionControlOss.tsx\n * @description OSS wrapper around @datarecce/ui ActionControl\n */\n\nimport { useLineageViewContextSafe } from \"../../contexts\";\nimport { ActionControl as BaseActionControl } from \"./controls\";\n\n/**\n * Props for the ActionControl wrapper component.\n */\nexport interface ActionControlOssProps {\n /**\n * Callback invoked when the user clicks the Close button (after action completes)\n */\n onClose: () => void;\n}\n\n/**\n * ActionControl Component (Wrapper)\n *\n * Wraps the @datarecce/ui ActionControl component with context from\n * LineageViewContext.\n */\nexport function ActionControlOss({ onClose }: ActionControlOssProps) {\n const { cancel, actionState } = useLineageViewContextSafe();\n\n return (\n <BaseActionControl\n actionState={actionState}\n onCancel={cancel}\n onClose={onClose}\n />\n );\n}\n","\"use client\";\n\n/**\n * @file ColumnLevelLineageControlOss.tsx\n * @description OSS wrapper around @datarecce/ui ColumnLevelLineageControl\n *\n * This wrapper:\n * 1. Connects the @datarecce/ui component to specific contexts\n * 2. Provides LineageViewContext callbacks as props\n * 3. Fetches server flags for single_env_onboarding\n */\n\nimport type { UseMutationResult } from \"@tanstack/react-query\";\nimport type { CllInput, ColumnLineageData } from \"../../api\";\nimport {\n useLineageGraphContext,\n useLineageViewContextSafe,\n useRecceServerFlag,\n} from \"../../contexts\";\nimport { ColumnLevelLineageControl as BaseColumnLevelLineageControl } from \"./controls\";\n\n/**\n * OSS wrapper for ColumnLevelLineageControl.\n *\n * Connects the @datarecce/ui component to:\n * - LineageViewContext for CLL operations\n * - LineageGraphContext for graph data\n * - Server flags for environment mode\n */\nexport const ColumnLevelLineageControlOss = ({\n action,\n}: {\n action: UseMutationResult<ColumnLineageData, Error, CllInput>;\n}) => {\n const {\n showColumnLevelLineage,\n resetColumnLevelLineage,\n interactive,\n viewOptions,\n centerNode,\n } = useLineageViewContextSafe();\n const { data: flagData } = useRecceServerFlag();\n const singleEnv = flagData?.single_env_onboarding ?? false;\n const { lineageGraph } = useLineageGraphContext();\n\n return (\n <BaseColumnLevelLineageControl\n action={action}\n interactive={interactive}\n viewOptions={viewOptions}\n lineageGraph={lineageGraph}\n singleEnvMode={singleEnv}\n onShowCll={showColumnLevelLineage}\n onResetCll={() => resetColumnLevelLineage()}\n onCenterNode={centerNode}\n />\n );\n};\n","\"use client\";\n\n/**\n * @file GraphColumnNodeOss.tsx\n * @description OSS wrapper for UI package LineageColumnNode component\n *\n * This component wraps the @datarecce/ui LineageColumnNode with OSS-specific\n * context integration. It extracts state from LineageViewContext and passes\n * it as props to the presentation component.\n *\n * Migration: Phase 3 of lineage component migration plan\n */\n\nimport type { NodeProps } from \"@xyflow/react\";\nimport { useStore } from \"@xyflow/react\";\nimport { type MouseEvent, memo } from \"react\";\nimport type { LineageGraphColumnNode } from \"../..\";\nimport { useLineageViewContextSafe } from \"../../contexts\";\nimport { useThemeColors } from \"../../hooks\";\nimport { LineageColumnNode, type LineageColumnNodeData } from \"./columns\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type GraphColumnNodeProps = NodeProps<LineageGraphColumnNode>;\n\n// =============================================================================\n// MAIN COMPONENT\n// =============================================================================\n\n/**\n * GraphColumnNode - OSS wrapper for UI package LineageColumnNode\n *\n * This component integrates LineageViewContext with the pure presentation\n * LineageColumnNode from @datarecce/ui.\n */\nfunction GraphColumnNodeComponent(nodeProps: GraphColumnNodeProps) {\n const { id: columnNodeId, data } = nodeProps;\n const { id: nodeId } = data.node;\n const { column, type, transformationType, changeStatus } = data;\n\n // Get zoom level for content visibility\n const showContent = useStore((s) => s.transform[2] > 0.3);\n\n // Get theme colors\n const { isDark } = useThemeColors();\n\n // Get context values\n const {\n viewOptions,\n showContextMenu,\n isNodeHighlighted,\n isNodeShowingChangeAnalysis,\n } = useLineageViewContextSafe();\n\n // Computed state\n const selectedNode = viewOptions.column_level_lineage?.node_id;\n const selectedColumn = viewOptions.column_level_lineage?.column;\n const isFocused = column === selectedColumn && nodeId === selectedNode;\n const isHighlighted = isNodeHighlighted(columnNodeId);\n const isShowingChangeAnalysis = isNodeShowingChangeAnalysis(nodeId);\n\n // Build LineageColumnNodeData\n const columnData: LineageColumnNodeData = {\n column,\n type,\n nodeId,\n transformationType:\n transformationType as LineageColumnNodeData[\"transformationType\"],\n changeStatus: changeStatus as LineageColumnNodeData[\"changeStatus\"],\n isHighlighted,\n isFocused,\n };\n\n // Callbacks\n const handleContextMenu = (event: MouseEvent, _columnId: string) => {\n showContextMenu(event, nodeProps as unknown as LineageGraphColumnNode);\n };\n\n return (\n <LineageColumnNode\n id={columnNodeId}\n data={columnData}\n showContent={showContent}\n showChangeAnalysis={isShowingChangeAnalysis}\n isDark={isDark}\n onContextMenu={handleContextMenu}\n />\n );\n}\n\nexport const GraphColumnNode = memo(GraphColumnNodeComponent);\nGraphColumnNode.displayName = \"GraphColumnNode\";\n","\"use client\";\n\n/**\n * @file GraphEdge.tsx\n * @description Graph edge component with dependency injection for highlighting\n *\n * This component renders a bezier edge in a React Flow graph with support for:\n * - Change status styling (added, removed edges)\n * - Highlighting via dependency injection\n * - Style customization\n *\n * The component uses dependency injection for context-dependent behavior,\n * allowing the OSS wrapper to inject its own highlighting logic.\n */\n\nimport { BaseEdge, type EdgeProps, getBezierPath } from \"@xyflow/react\";\nimport { memo } from \"react\";\nimport type { LineageGraphEdge } from \"../../../contexts/lineage/types\";\nimport { type ChangeStatus, getIconForChangeStatus } from \"../styles\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Data structure for graph edge - re-exported from LineageGraphEdge for convenience\n */\nexport type GraphEdgeData = LineageGraphEdge[\"data\"];\n\n/**\n * Edge type for React Flow - uses LineageGraphEdge from contexts\n */\nexport type GraphEdgeType = LineageGraphEdge;\n\n/**\n * Props for the GraphEdge component with dependency injection\n */\nexport interface GraphEdgeProps extends EdgeProps<LineageGraphEdge> {\n /**\n * Dependency injection: function to determine if an edge is highlighted.\n * When not provided, the edge is always highlighted (fully visible).\n *\n * @param source - Source node ID\n * @param target - Target node ID\n * @returns Whether the edge should be highlighted\n *\n * @example\n * ```tsx\n * // Inject highlighting from context\n * const { isEdgeHighlighted } = useLineageViewContext();\n * <GraphEdge {...props} isEdgeHighlighted={isEdgeHighlighted} />\n * ```\n */\n isEdgeHighlighted?: (source: string, target: string) => boolean;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Graph edge component for lineage visualization\n *\n * Renders a bezier edge with:\n * - Color based on change status (green for added, red for removed)\n * - Dashed line for changed edges\n * - Dimmed appearance for non-highlighted edges\n *\n * @param props - Edge props including source/target coordinates and data\n * @returns Rendered SVG edge element\n *\n * @example\n * ```tsx\n * // Basic usage (always highlighted)\n * <GraphEdge {...edgeProps} />\n *\n * // With dependency injection for highlighting\n * <GraphEdge\n * {...edgeProps}\n * isEdgeHighlighted={(source, target) => highlightedEdges.has(`${source}-${target}`)}\n * />\n * ```\n */\nfunction GraphEdgeComponent(props: GraphEdgeProps) {\n const {\n source,\n target,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n style: styleOverride = {},\n markerEnd,\n data,\n isEdgeHighlighted,\n } = props;\n\n const style: React.CSSProperties = {\n ...styleOverride,\n };\n\n // Apply change status styling\n if (data?.changeStatus) {\n // Cast to ChangeStatus from styles module (added, removed, modified, unchanged)\n const statusStyle = getIconForChangeStatus(\n data.changeStatus as ChangeStatus,\n );\n style.stroke = statusStyle.hexColor;\n style.strokeDasharray = \"5\";\n }\n\n // Apply highlighting filter via dependency injection\n // Default to highlighted (true) if no function provided\n const isHighlighted = isEdgeHighlighted\n ? isEdgeHighlighted(source, target)\n : true;\n\n if (!isHighlighted) {\n style.filter = \"opacity(0.2) grayscale(50%)\";\n }\n\n const [edgePath] = getBezierPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n });\n\n return (\n <>\n <BaseEdge\n path={edgePath}\n markerEnd={markerEnd}\n style={{ ...style, ...styleOverride }}\n />\n </>\n );\n}\n\n/**\n * Memoized GraphEdge component for performance optimization\n */\nexport const GraphEdge = memo(GraphEdgeComponent);\nGraphEdge.displayName = \"GraphEdge\";\n","\"use client\";\n\n/**\n * @file GraphEdgeOss.tsx\n * @description wrapper for GraphEdge that injects LineageViewContext dependencies\n *\n * This thin wrapper imports the core GraphEdge component from @datarecce/ui\n * and injects dependencies:\n * - isEdgeHighlighted from LineageViewContext\n */\n\nimport type { EdgeProps } from \"@xyflow/react\";\nimport type { LineageGraphEdge } from \"../..\";\nimport { useLineageViewContextSafe } from \"../../contexts\";\nimport { GraphEdge as GraphEdgeBase } from \"./edges\";\n\nimport \"../../styles\";\n\ntype GraphEdgeProps = EdgeProps<LineageGraphEdge>;\n\n/**\n * OSS GraphEdge component that wraps the UI package's GraphEdge\n * with context-based dependency injection.\n *\n * Injects:\n * - isEdgeHighlighted: from LineageViewContext for context-aware highlighting\n */\nexport default function GraphEdgeOss(props: GraphEdgeProps) {\n const { isEdgeHighlighted } = useLineageViewContextSafe();\n\n return <GraphEdgeBase {...props} isEdgeHighlighted={isEdgeHighlighted} />;\n}\n","\"use client\";\n\n/**\n * @file ActionTag.tsx\n * @description Pure presentation component for displaying action status in lineage nodes\n *\n * This component displays the status of an action (pending, running, skipped, error, or result).\n * It is designed to be used with lineage graph nodes and receives all data via props.\n *\n * Source: Simplified from OSS js/src/components/lineage/ActionTag.tsx\n */\n\nimport Box from \"@mui/material/Box\";\nimport Chip from \"@mui/material/Chip\";\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport Stack from \"@mui/material/Stack\";\nimport Tooltip from \"@mui/material/Tooltip\";\nimport { memo } from \"react\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Action status values\n */\nexport type ActionStatus =\n | \"pending\"\n | \"running\"\n | \"skipped\"\n | \"success\"\n | \"error\";\n\n/**\n * Progress information for running actions\n */\nexport interface ActionProgress {\n /** Progress percentage (0-1) */\n percentage?: number;\n /** Current step description */\n message?: string;\n}\n\n/**\n * Value diff result summary\n */\nexport interface ValueDiffResult {\n /** Number of mismatched columns */\n mismatchedColumns: number;\n /** Total number of columns compared */\n totalColumns: number;\n}\n\n/**\n * Row count diff result summary\n */\nexport interface RowCountDiffResult {\n /** Base row count (null if not available) */\n base: number | null;\n /** Current row count (null if not available) */\n current: number | null;\n}\n\n/**\n * Props for ActionTag component\n */\nexport interface ActionTagProps {\n /** Current status of the action */\n status: ActionStatus;\n /** Skip reason if status is 'skipped' */\n skipReason?: string;\n /** Error message if status is 'error' */\n errorMessage?: string;\n /** Progress info if status is 'running' */\n progress?: ActionProgress;\n /** Value diff result if this is a value diff action */\n valueDiffResult?: ValueDiffResult;\n /** Row count diff result if this is a row count diff action */\n rowCountDiffResult?: RowCountDiffResult;\n /** Run ID to display as fallback */\n runId?: string;\n /** Test ID for testing */\n \"data-testid\"?: string;\n}\n\n// =============================================================================\n// ICON COMPONENTS\n// =============================================================================\n\n/**\n * Info icon for tooltips\n */\nconst InfoIcon = () => (\n <svg\n stroke=\"currentColor\"\n fill=\"currentColor\"\n strokeWidth=\"0\"\n viewBox=\"0 0 256 256\"\n height=\"1em\"\n width=\"1em\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm16-40a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176ZM112,84a12,12,0,1,1,12,12A12,12,0,0,1,112,84Z\" />\n </svg>\n);\n\n/**\n * Warning icon for error states\n */\nconst WarningIcon = () => (\n <svg\n stroke=\"currentColor\"\n fill=\"currentColor\"\n strokeWidth=\"0\"\n viewBox=\"0 0 256 256\"\n height=\"1em\"\n width=\"1em\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M236.8,188.09,149.35,36.22h0a24.76,24.76,0,0,0-42.7,0L19.2,188.09a23.51,23.51,0,0,0,0,23.72A24.35,24.35,0,0,0,40.55,224h174.9a24.35,24.35,0,0,0,21.33-12.19A23.51,23.51,0,0,0,236.8,188.09ZM222.93,203.8a8.5,8.5,0,0,1-7.48,4.2H40.55a8.5,8.5,0,0,1-7.48-4.2,7.59,7.59,0,0,1,0-7.72L120.52,44.21a8.75,8.75,0,0,1,15,0l87.45,151.87A7.59,7.59,0,0,1,222.93,203.8ZM120,144V104a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm20,36a12,12,0,1,1-12-12A12,12,0,0,1,140,180Z\" />\n </svg>\n);\n\n// =============================================================================\n// HELPER COMPONENTS\n// =============================================================================\n\n/**\n * Skipped status display\n */\nfunction SkippedTag({ skipReason }: { skipReason?: string }) {\n return (\n <Chip\n size=\"small\"\n label={\n <Stack\n direction=\"row\"\n sx={{\n fontSize: \"10pt\",\n color: \"grey.500\",\n alignItems: \"center\",\n gap: \"3px\",\n }}\n >\n <Box>Skipped</Box>\n {skipReason && (\n <Tooltip title={skipReason}>\n <Box component=\"span\" sx={{ display: \"flex\" }}>\n <InfoIcon />\n </Box>\n </Tooltip>\n )}\n </Stack>\n }\n sx={{ bgcolor: \"grey.100\" }}\n />\n );\n}\n\n/**\n * Error status display\n */\nfunction ErrorTag({ errorMessage }: { errorMessage?: string }) {\n return (\n <Stack\n direction=\"row\"\n sx={{ fontSize: \"10pt\", color: \"gray\", alignItems: \"center\" }}\n >\n <Box>Error</Box>\n {errorMessage && (\n <Tooltip title={errorMessage}>\n <Box component=\"span\" sx={{ display: \"flex\" }}>\n <WarningIcon />\n </Box>\n </Tooltip>\n )}\n </Stack>\n );\n}\n\n/**\n * Value diff result display\n */\nfunction ValueDiffTag({ result }: { result: ValueDiffResult }) {\n const { mismatchedColumns } = result;\n const hasIssues = mismatchedColumns > 0;\n\n return (\n <Chip\n size=\"small\"\n sx={{\n bgcolor: hasIssues ? \"error.light\" : \"success.light\",\n }}\n label={\n <Stack\n direction=\"row\"\n sx={{\n fontSize: \"10pt\",\n color: hasIssues ? \"error.main\" : \"success.main\",\n alignItems: \"center\",\n gap: \"3px\",\n }}\n >\n {hasIssues\n ? `${mismatchedColumns} columns mismatched`\n : \"All columns match\"}\n </Stack>\n }\n />\n );\n}\n\n/**\n * Row count diff result display\n */\nfunction RowCountDiffTag({ result }: { result: RowCountDiffResult }) {\n const { base, current } = result;\n const baseLabel = base === null ? \"N/A\" : base.toLocaleString();\n const currentLabel = current === null ? \"N/A\" : current.toLocaleString();\n\n // Determine change direction\n let changeIndicator = \"\";\n let changeColor = \"grey.500\";\n\n if (base !== null && current !== null) {\n if (current > base) {\n changeIndicator = \"↑\";\n changeColor = \"success.main\";\n } else if (current < base) {\n changeIndicator = \"↓\";\n changeColor = \"error.main\";\n } else {\n changeIndicator = \"=\";\n }\n }\n\n return (\n <Chip\n size=\"small\"\n sx={{ bgcolor: \"grey.100\" }}\n label={\n <Stack\n direction=\"row\"\n sx={{\n fontSize: \"10pt\",\n alignItems: \"center\",\n gap: \"3px\",\n }}\n >\n <Box>{baseLabel}</Box>\n <Box>→</Box>\n <Box>{currentLabel}</Box>\n {changeIndicator && (\n <Box component=\"span\" sx={{ color: changeColor, ml: 0.5 }}>\n {changeIndicator}\n </Box>\n )}\n </Stack>\n }\n />\n );\n}\n\n// =============================================================================\n// MAIN COMPONENT\n// =============================================================================\n\n/**\n * ActionTag - Pure presentation component for action status\n *\n * Displays the current status of an action with appropriate visual feedback:\n * - Pending: Spinner\n * - Running: Progress indicator (indeterminate or percentage)\n * - Skipped: Chip with optional reason tooltip\n * - Error: Error text with optional message tooltip\n * - Success with value diff: Match/mismatch summary\n * - Success with row count diff: Count comparison\n *\n * @example\n * ```tsx\n * // Pending action\n * <ActionTag status=\"pending\" />\n *\n * // Running with progress\n * <ActionTag status=\"running\" progress={{ percentage: 0.5 }} />\n *\n * // Skipped with reason\n * <ActionTag status=\"skipped\" skipReason=\"No changes detected\" />\n *\n * // Value diff result\n * <ActionTag\n * status=\"success\"\n * valueDiffResult={{ mismatchedColumns: 2, totalColumns: 10 }}\n * />\n * ```\n */\nfunction ActionTagComponent({\n status,\n skipReason,\n errorMessage,\n progress,\n valueDiffResult,\n rowCountDiffResult,\n runId,\n \"data-testid\": testId,\n}: ActionTagProps) {\n // Pending state\n if (status === \"pending\") {\n return (\n <CircularProgress size={16} data-testid={testId} data-status=\"pending\" />\n );\n }\n\n // Skipped state\n if (status === \"skipped\") {\n return (\n <Box data-testid={testId} data-status=\"skipped\">\n <SkippedTag skipReason={skipReason} />\n </Box>\n );\n }\n\n // Running state\n if (status === \"running\") {\n if (progress?.percentage === undefined) {\n return (\n <CircularProgress\n size={16}\n data-testid={testId}\n data-status=\"running\"\n />\n );\n }\n return (\n <CircularProgress\n variant=\"determinate\"\n value={progress.percentage * 100}\n size={16}\n data-testid={testId}\n data-status=\"running\"\n />\n );\n }\n\n // Error state\n if (status === \"error\") {\n return (\n <Box data-testid={testId} data-status=\"error\">\n <ErrorTag errorMessage={errorMessage} />\n </Box>\n );\n }\n\n // Success state with value diff result\n if (valueDiffResult) {\n return (\n <Box data-testid={testId} data-status=\"success\">\n <ValueDiffTag result={valueDiffResult} />\n </Box>\n );\n }\n\n // Success state with row count diff result\n if (rowCountDiffResult) {\n return (\n <Box data-testid={testId} data-status=\"success\">\n <RowCountDiffTag result={rowCountDiffResult} />\n </Box>\n );\n }\n\n // Fallback: show run ID\n return (\n <Box data-testid={testId} data-status=\"success\">\n {runId || \"Complete\"}\n </Box>\n );\n}\n\nexport const ActionTag = memo(ActionTagComponent);\nActionTag.displayName = \"ActionTag\";\n","/**\n * TimelineEvent - Renders a single event in the check timeline.\n *\n * Handles different event types:\n * - check_created: Shows creation message\n * - comment: Shows user comment with edit/delete options\n * - approval_change: Shows approval status change\n * - description_change: Shows description update\n * - name_change: Shows name update\n * - preset_applied: Shows preset application\n */\n\n\"use client\";\n\nimport MuiAvatar from \"@mui/material/Avatar\";\nimport Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Popover from \"@mui/material/Popover\";\nimport Stack from \"@mui/material/Stack\";\nimport TextField from \"@mui/material/TextField\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport { formatDistanceToNow } from \"date-fns\";\nimport { type MouseEvent, useState } from \"react\";\nimport {\n PiBookmarkSimple,\n PiChatText,\n PiCheckCircle,\n PiCircle,\n PiNotePencil,\n PiPencilSimple,\n PiPlusCircle,\n PiTrashSimple,\n} from \"react-icons/pi\";\nimport { type CheckEvent, getEventIconType } from \"../../../api\";\nimport { useAvatar } from \"../../../hooks/useAvatar\";\nimport { useIsDark } from \"../../../hooks/useIsDark\";\nimport { MarkdownContent } from \"../../../primitives\";\n\ninterface TimelineEventProps {\n event: CheckEvent;\n currentUserId?: string;\n onEdit?: (eventId: string, content: string) => Promise<void>;\n onDelete?: (eventId: string) => Promise<void>;\n}\n\nfunction EventIcon({ event }: { event: CheckEvent }) {\n const iconType = getEventIconType(event);\n\n const iconMap = {\n create: PiPlusCircle,\n comment: PiChatText,\n approve: PiCheckCircle,\n unapprove: PiCircle,\n edit: PiNotePencil,\n preset: PiBookmarkSimple,\n };\n\n const colorMap: Record<string, string> = {\n create: \"primary.main\",\n comment: \"grey.500\",\n approve: \"success.main\",\n unapprove: \"grey.400\",\n edit: \"warning.main\",\n preset: \"secondary.main\",\n };\n\n const IconComponent = iconMap[iconType];\n const color = colorMap[iconType];\n\n return <Box component={IconComponent} sx={{ color, fontSize: 16 }} />;\n}\n\nfunction UserAvatar({ event }: { event: CheckEvent }) {\n const { actor } = event;\n const { avatarUrl } = useAvatar({ userId: actor.user_id });\n\n const displayName = actor.fullname || actor.login || \"User\";\n const initials = displayName.charAt(0).toUpperCase();\n\n return (\n <MuiAvatar\n src={avatarUrl || undefined}\n sx={{ width: 24, height: 24, fontSize: \"0.75rem\" }}\n >\n {initials}\n </MuiAvatar>\n );\n}\n\nfunction StateChangeEvent({ event }: { event: CheckEvent }) {\n const { actor } = event;\n const actorName = actor.fullname || actor.login || \"Someone\";\n const relativeTime = formatDistanceToNow(new Date(event.created_at), {\n addSuffix: true,\n });\n\n let message = \"\";\n switch (event.event_type) {\n case \"check_created\":\n message = \"created this check\";\n break;\n case \"approval_change\":\n message =\n event.new_value === \"true\"\n ? \"approved this check\"\n : \"unapproved this check\";\n break;\n case \"description_change\":\n message = \"updated the description\";\n break;\n case \"name_change\":\n message = \"renamed this check\";\n break;\n case \"preset_applied\":\n message = \"applied a preset\";\n break;\n default:\n message = \"made a change\";\n }\n\n return (\n <Box sx={{ display: \"flex\", gap: 1, alignItems: \"flex-start\", py: 1 }}>\n <Box sx={{ pt: \"2px\" }}>\n <EventIcon event={event} />\n </Box>\n <Box sx={{ flex: 1 }}>\n <Stack\n direction=\"row\"\n spacing={0.5}\n flexWrap=\"wrap\"\n alignItems=\"center\"\n >\n <UserAvatar event={event} />\n <Typography variant=\"body2\" fontWeight=\"500\">\n {actorName}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {message}\n </Typography>\n <Typography variant=\"caption\" color=\"text.disabled\">\n {relativeTime}\n </Typography>\n </Stack>\n </Box>\n </Box>\n );\n}\n\nfunction CommentEvent({\n event,\n currentUserId,\n onEdit,\n onDelete,\n}: {\n event: CheckEvent;\n currentUserId?: string;\n onEdit?: (eventId: string, content: string) => Promise<void>;\n onDelete?: (eventId: string) => Promise<void>;\n}) {\n const isDark = useIsDark();\n const [isEditing, setIsEditing] = useState(false);\n const [editContent, setEditContent] = useState(event.content || \"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isDeleting, setIsDeleting] = useState(false);\n const [deleteAnchorEl, setDeleteAnchorEl] = useState<HTMLElement | null>(\n null,\n );\n const isDeletePopoverOpen = Boolean(deleteAnchorEl);\n\n const { actor } = event;\n const actorName = actor.fullname || actor.login || \"Someone\";\n const relativeTime = formatDistanceToNow(new Date(event.created_at), {\n addSuffix: true,\n });\n const isAuthor =\n currentUserId && String(actor.user_id) === String(currentUserId);\n\n const handleStartEdit = () => {\n setEditContent(event.content || \"\");\n setIsEditing(true);\n };\n\n const handleCancelEdit = () => {\n setEditContent(event.content || \"\");\n setIsEditing(false);\n };\n\n const handleSaveEdit = async () => {\n const trimmed = editContent.trim();\n if (!trimmed || trimmed === event.content) {\n handleCancelEdit();\n return;\n }\n\n if (onEdit) {\n setIsSubmitting(true);\n try {\n await onEdit(event.id, trimmed);\n setIsEditing(false);\n } finally {\n setIsSubmitting(false);\n }\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Escape\") {\n handleCancelEdit();\n } else if (e.key === \"Enter\" && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n handleSaveEdit();\n }\n };\n\n const handleDeleteClick = (event: MouseEvent<HTMLButtonElement>) => {\n setDeleteAnchorEl(event.currentTarget);\n };\n\n const handleDeleteClose = () => {\n setDeleteAnchorEl(null);\n };\n\n const handleDelete = async () => {\n if (onDelete) {\n setIsDeleting(true);\n try {\n await onDelete(event.id);\n handleDeleteClose();\n } finally {\n setIsDeleting(false);\n }\n }\n };\n\n if (event.is_deleted) {\n return (\n <Box sx={{ display: \"flex\", gap: 1, alignItems: \"center\", py: 1 }}>\n <Box sx={{ pt: \"2px\", display: \"flex\", alignItems: \"center\" }}>\n <EventIcon event={event} />\n </Box>\n <Box sx={{ display: \"flex\", flex: 1, alignItems: \"center\" }}>\n <Typography variant=\"body2\" color=\"text.disabled\" fontStyle=\"italic\">\n Comment deleted\n </Typography>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box sx={{ display: \"flex\", gap: 1, alignItems: \"flex-start\", py: 1 }}>\n <Box sx={{ pt: \"2px\" }}>\n <EventIcon event={event} />\n </Box>\n <Box sx={{ flex: 1 }}>\n <Stack\n direction=\"row\"\n spacing={0.5}\n sx={{ mb: 0.5 }}\n flexWrap=\"wrap\"\n alignItems=\"center\"\n >\n <UserAvatar event={event} />\n <Typography variant=\"body2\" fontWeight=\"500\">\n {actorName}\n {isAuthor && (\n <Typography\n component=\"span\"\n variant=\"body2\"\n color=\"text.secondary\"\n >\n {\" \"}\n (Author)\n </Typography>\n )}\n </Typography>\n <Typography variant=\"caption\" color=\"text.disabled\">\n {relativeTime}\n </Typography>\n {event.is_edited && (\n <Typography variant=\"caption\" color=\"text.disabled\">\n (edited)\n </Typography>\n )}\n </Stack>\n\n {isEditing ? (\n // Edit mode\n <Box>\n <TextField\n value={editContent}\n onChange={(e) => setEditContent(e.target.value)}\n onKeyDown={handleKeyDown}\n size=\"small\"\n multiline\n minRows={3}\n fullWidth\n disabled={isSubmitting}\n autoFocus\n sx={{\n \"& .MuiOutlinedInput-root\": {\n bgcolor: \"background.paper\",\n \"&:focus-within\": {\n borderColor: \"primary.main\",\n },\n },\n }}\n />\n <Stack\n direction=\"row\"\n spacing={1}\n sx={{ mt: 1 }}\n justifyContent=\"flex-end\"\n >\n <Button\n size=\"small\"\n variant=\"text\"\n onClick={handleCancelEdit}\n disabled={isSubmitting}\n >\n Cancel\n </Button>\n <Button\n size=\"small\"\n variant=\"contained\"\n onClick={handleSaveEdit}\n disabled={!editContent.trim() || isSubmitting}\n >\n {isSubmitting ? \"Saving...\" : \"Save\"}\n </Button>\n </Stack>\n </Box>\n ) : (\n // View mode\n <Box\n sx={{\n bgcolor: isDark ? \"grey.800\" : \"grey.50\",\n borderRadius: 1,\n p: 1,\n border: \"1px solid\",\n borderColor: isDark ? \"grey.700\" : \"grey.200\",\n position: \"relative\",\n \"&:hover .comment-actions\": {\n opacity: 1,\n },\n }}\n >\n <MarkdownContent content={event.content || \"\"} fontSize=\"sm\" />\n\n {/* Edit/Delete buttons - only visible to author on hover */}\n {isAuthor && (onEdit || onDelete) && (\n <Stack\n className=\"comment-actions\"\n direction=\"row\"\n spacing={0}\n sx={{\n position: \"absolute\",\n top: 4,\n right: 4,\n opacity: 0,\n transition: \"opacity 0.2s\",\n }}\n >\n {onEdit && (\n <MuiTooltip title=\"Edit comment\">\n <IconButton\n aria-label=\"Edit comment\"\n size=\"small\"\n onClick={handleStartEdit}\n >\n <PiPencilSimple />\n </IconButton>\n </MuiTooltip>\n )}\n {onDelete && (\n <>\n <MuiTooltip title=\"Delete comment\">\n <IconButton\n aria-label=\"Delete comment\"\n size=\"small\"\n color=\"error\"\n onClick={handleDeleteClick}\n >\n <PiTrashSimple />\n </IconButton>\n </MuiTooltip>\n <Popover\n open={isDeletePopoverOpen}\n anchorEl={deleteAnchorEl}\n onClose={handleDeleteClose}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"center\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"center\",\n }}\n >\n <Box sx={{ p: 2 }}>\n <Typography variant=\"body2\" sx={{ mb: 2 }}>\n Delete this comment?\n </Typography>\n <Stack\n direction=\"row\"\n spacing={1}\n justifyContent=\"flex-end\"\n >\n <Button\n size=\"small\"\n variant=\"text\"\n onClick={handleDeleteClose}\n disabled={isDeleting}\n >\n Cancel\n </Button>\n <Button\n size=\"small\"\n variant=\"contained\"\n color=\"error\"\n onClick={handleDelete}\n disabled={isDeleting}\n >\n {isDeleting ? \"Deleting...\" : \"Delete\"}\n </Button>\n </Stack>\n </Box>\n </Popover>\n </>\n )}\n </Stack>\n )}\n </Box>\n )}\n </Box>\n </Box>\n );\n}\n\nexport function TimelineEventOss({\n event,\n currentUserId,\n onEdit,\n onDelete,\n}: TimelineEventProps) {\n if (event.event_type === \"comment\") {\n return (\n <CommentEvent\n event={event}\n currentUserId={currentUserId}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n );\n }\n\n return <StateChangeEvent event={event} />;\n}\n","/**\n * CheckTimeline - Main timeline/conversation panel for a check.\n *\n * Displays a chronological list of events (comments, state changes)\n * and provides an input for adding new comments.\n *\n * This component is only rendered when connected to Recce Cloud.\n */\n\n\"use client\";\n\nimport Box from \"@mui/material/Box\";\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport Divider from \"@mui/material/Divider\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { cacheKeys } from \"../../../api\";\nimport { useApiConfig, useCheckEvents, useIsDark } from \"../../../hooks\";\nimport { fetchUser } from \"../../../lib/api/user\";\nimport { CommentInput } from \"../../../primitives\";\nimport { TimelineEventOss as TimelineEvent } from \"./TimelineEventOss\";\n\ninterface CheckTimelineProps {\n checkId: string;\n}\n\nexport function CheckTimelineOss({ checkId }: CheckTimelineProps) {\n const isDark = useIsDark();\n const { apiClient } = useApiConfig();\n const {\n events,\n isLoading,\n error,\n createComment,\n isCreatingComment,\n updateComment,\n deleteComment,\n } = useCheckEvents(checkId);\n\n // Get current user for determining edit/delete permissions\n const { data: currentUser } = useQuery({\n queryKey: cacheKeys.user(),\n queryFn: () => fetchUser(apiClient),\n retry: false,\n });\n\n const handleCreateComment = (content: string) => {\n createComment(content);\n };\n\n const handleEditComment = async (eventId: string, content: string) => {\n await updateComment({ eventId, content });\n };\n\n const handleDeleteComment = async (eventId: string) => {\n await deleteComment(eventId);\n };\n\n if (isLoading) {\n return (\n <Box\n sx={{\n height: \"100%\",\n p: 4,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <CircularProgress size={20} />\n </Box>\n );\n }\n\n if (error) {\n return (\n <Box\n sx={{\n height: \"100%\",\n p: 4,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <Typography sx={{ fontSize: \"0.875rem\", color: \"error.main\" }}>\n Failed to load timeline\n </Typography>\n </Box>\n );\n }\n\n return (\n <Stack\n sx={{\n height: \"100%\",\n alignItems: \"stretch\",\n borderLeft: \"1px solid\",\n borderColor: isDark ? \"grey.700\" : \"grey.200\",\n }}\n spacing={0}\n >\n {/* Header */}\n <Box\n sx={{\n px: 3,\n py: 2,\n borderBottom: \"1px solid\",\n borderColor: isDark ? \"grey.700\" : \"grey.200\",\n }}\n >\n <Typography variant=\"subtitle2\" sx={{ fontWeight: 500 }}>\n Activity\n </Typography>\n </Box>\n\n {/* Events List - Scrollable */}\n <Box sx={{ flex: 1, overflowY: \"auto\", px: 3, py: 2 }}>\n {events.length === 0 ? (\n <Typography sx={{ fontSize: \"0.875rem\", color: \"grey.500\" }}>\n No activity yet\n </Typography>\n ) : (\n <Stack sx={{ alignItems: \"stretch\" }} spacing={0}>\n {events.map((event, index) => (\n <Box key={event.id}>\n <TimelineEvent\n event={event}\n currentUserId={currentUser?.id}\n onEdit={handleEditComment}\n onDelete={handleDeleteComment}\n />\n {index < events.length - 1 && (\n <Divider\n sx={{ borderColor: isDark ? \"grey.700\" : \"grey.100\" }}\n />\n )}\n </Box>\n ))}\n </Stack>\n )}\n </Box>\n\n {/* Comment Input - Fixed at bottom */}\n <Box\n sx={{\n px: 3,\n py: 3,\n borderTop: \"1px solid\",\n borderColor: isDark ? \"grey.700\" : \"grey.200\",\n bgcolor: isDark ? \"grey.900\" : \"grey.50\",\n }}\n >\n <CommentInput\n onSubmit={handleCreateComment}\n isSubmitting={isCreatingComment}\n />\n </Box>\n </Stack>\n );\n}\n","\"use client\";\n\nimport Box from \"@mui/material/Box\";\n\nexport interface SquareIconProps {\n /** The background color of the square icon */\n color: string;\n}\n\n/**\n * A small square icon used in chart legends\n */\nexport function SquareIcon({ color }: SquareIconProps) {\n return (\n <Box\n component=\"span\"\n sx={{\n display: \"inline-block\",\n width: \"10px\",\n height: \"10px\",\n bgcolor: color,\n mr: 1,\n borderRadius: \"4px\",\n }}\n />\n );\n}\n","\"use client\";\n\nimport Box, { type BoxProps } from \"@mui/material/Box\";\nimport Stack from \"@mui/material/Stack\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport { useMemo } from \"react\";\nimport { PiInfo } from \"react-icons/pi\";\nimport type { NodeColumnData } from \"../../api\";\nimport { useLineageGraphContext } from \"../../contexts\";\nimport { DropdownValuesInput } from \"../ui/DropdownValuesInput\";\n\nexport interface QueryFormProps extends BoxProps {\n defaultPrimaryKeys: string[] | undefined;\n onPrimaryKeysChange: (primaryKeys: string[]) => void;\n}\n\nexport const QueryForm = ({\n defaultPrimaryKeys,\n onPrimaryKeysChange,\n ...props\n}: QueryFormProps) => {\n const { lineageGraph, isActionAvailable } = useLineageGraphContext();\n\n const labelInfo =\n \"Provide a primary key to perform query diff in data warehouse and only return changed rows.\";\n\n const availableColumns = useMemo(() => {\n if (!lineageGraph) {\n return [];\n }\n const columnSet = new Set<string>();\n for (const modelName in lineageGraph.nodes) {\n const model = lineageGraph.nodes[modelName];\n const combinedColumns: Record<string, NodeColumnData | undefined> = {\n ...(model.data.data.base?.columns ?? {}),\n ...(model.data.data.current?.columns ?? {}),\n };\n\n Object.entries(combinedColumns).forEach(([columnName, col]) => {\n if (col?.unique) {\n columnSet.add(columnName);\n }\n });\n }\n return Array.from(columnSet).sort();\n }, [lineageGraph]);\n\n return (\n <Box sx={{ display: \"flex\" }} {...props}>\n <Stack spacing={0} sx={{ m: \"0 0.5rem\" }}>\n <Stack direction=\"row\" alignItems=\"center\" spacing={0.5}>\n <Typography\n component=\"label\"\n sx={{ fontSize: \"0.625rem\", color: \"text.secondary\" }}\n >\n Diff with Primary Key(s) (suggested)\n </Typography>\n <MuiTooltip title={labelInfo} placement=\"bottom-end\">\n <Box\n component=\"span\"\n sx={{ display: \"flex\", color: \"grey.600\", cursor: \"help\" }}\n >\n <PiInfo fontSize=\"0.75rem\" />\n </Box>\n </MuiTooltip>\n </Stack>\n <DropdownValuesInput\n className=\"no-track-pii-safe\"\n unitName=\"key\"\n defaultValues={defaultPrimaryKeys}\n suggestionList={availableColumns}\n onValuesChange={onPrimaryKeysChange}\n size=\"2xs\"\n width={\"240px\"}\n placeholder=\"Select or type to add keys\"\n disabled={!isActionAvailable(\"query_diff_with_primary_key\")}\n />\n </Stack>\n </Box>\n );\n};\n","\"use client\";\n\nimport Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { RiTerminalBoxLine } from \"react-icons/ri\";\nimport { useRecceInstanceInfo } from \"../../contexts\";\nimport { getSettingsUrl } from \"../../utils\";\n\nexport interface SetupConnectionGuideProps {\n /** URL for the support calendar booking (e.g., \"https://cal.com/team/recce/chat\") */\n supportCalendarUrl?: string;\n}\n\n/**\n * SetupConnectionGuide - displays guidance when data warehouse connection is not configured\n *\n * This component shows a guide to help users connect to a data warehouse\n * when query functions are disabled due to missing connection.\n */\nexport function SetupConnectionGuide({\n supportCalendarUrl = \"https://cal.com/team/recce/chat\",\n}: SetupConnectionGuideProps) {\n const { data: instanceInfo } = useRecceInstanceInfo();\n\n return (\n <div className=\"flex flex-1 h-full min-h-0 m-2 p-4 bg-blue-50 rounded-lg shadow-md justify-center\">\n <div className=\"w-4/5 flex flex-col overflow-y-auto gap-6 px-8 pb-8\">\n <Stack alignItems=\"center\" spacing={2}>\n <Box\n sx={{\n p: 1,\n bgcolor: \"background.paper\",\n borderRadius: \"50%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n boxShadow: 2,\n }}\n >\n <Box\n component={RiTerminalBoxLine}\n sx={{ fontSize: 28, color: \"iochmara.500\" }}\n />\n </Box>\n <Typography variant=\"h5\" sx={{ mt: 2 }}>\n Wait, there's more!\n </Typography>\n <Typography sx={{ fontSize: \"1rem\", textAlign: \"center\" }}>\n Query functions disabled without a{\" \"}\n <Typography component=\"span\" sx={{ fontWeight: \"bold\" }}>\n data warehouse connection\n </Typography>\n </Typography>\n </Stack>\n <Stack sx={{ width: \"50%\", mt: 3, mx: \"auto\" }}>\n <Button\n color=\"iochmara\"\n variant=\"contained\"\n size=\"large\"\n onClick={() => {\n window.open(\n getSettingsUrl(instanceInfo, supportCalendarUrl),\n \"_blank\",\n );\n }}\n >\n Connect to Data Warehouse\n </Button>\n </Stack>\n </div>\n </div>\n );\n}\n\nexport default SetupConnectionGuide;\n","\"use client\";\n\nimport Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Stack from \"@mui/material/Stack\";\nimport MuiSwitch from \"@mui/material/Switch\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { useMemo } from \"react\";\nimport { PiInfoFill } from \"react-icons/pi\";\nimport {\n type QueryParams,\n type SubmitOptions,\n submitQuery,\n submitQueryBase,\n submitQueryDiff,\n waitRun,\n} from \"../../api\";\nimport { HistoryToggle } from \"../../components\";\nimport { SetupConnectionPopover } from \"../../components/app\";\nimport { BaseEnvironmentSetupGuide } from \"../../components/lineage\";\nimport {\n useLineageGraphContext,\n useRecceActionContext,\n useRecceInstanceContext,\n} from \"../../contexts\";\nimport {\n defaultSqlQuery,\n useApiConfig,\n useRecceQueryContext,\n} from \"../../hooks\";\nimport { RECCE_SUPPORT_CALENDAR_URL } from \"../../lib/const\";\nimport { QueryForm } from \"./QueryForm\";\nimport { SetupConnectionGuide } from \"./SetupConnectionGuide\";\nimport SqlEditor, { DualSqlEditor } from \"./SqlEditor\";\n\nconst QueryModeToggle = () => {\n const { isCustomQueries, setCustomQueries, sqlQuery, setBaseSqlQuery } =\n useRecceQueryContext();\n const handleToggle = () => {\n if (!isCustomQueries && setBaseSqlQuery) setBaseSqlQuery(sqlQuery);\n setCustomQueries(!isCustomQueries);\n };\n const customQueriesDescription =\n \"Custom queries allow you to use two SQL queries to compare results between current and base environments.\";\n return (\n <Box>\n <Stack\n direction=\"row\"\n spacing={0.5}\n alignItems=\"center\"\n fontSize=\"0.75rem\"\n >\n <Typography variant=\"body2\" sx={{ fontSize: \"0.75rem\" }}>\n Custom Queries\n </Typography>\n <MuiTooltip title={customQueriesDescription}>\n <Box component=\"span\" sx={{ display: \"flex\", color: \"grey.600\" }}>\n <PiInfoFill fontSize=\"1rem\" />\n </Box>\n </MuiTooltip>\n </Stack>\n <MuiSwitch\n size=\"small\"\n checked={isCustomQueries}\n onChange={handleToggle}\n color=\"primary\"\n />\n </Box>\n );\n};\n\nexport const QueryPageOss = () => {\n const {\n sqlQuery: _sqlQuery,\n baseSqlQuery,\n setSqlQuery,\n setBaseSqlQuery,\n primaryKeys,\n setPrimaryKeys,\n isCustomQueries,\n } = useRecceQueryContext();\n const { lineageGraph, envInfo } = useLineageGraphContext();\n const { featureToggles, singleEnv } = useRecceInstanceContext();\n\n let sqlQuery = _sqlQuery;\n if (envInfo?.adapterType === \"sqlmesh\" && _sqlQuery === defaultSqlQuery) {\n sqlQuery = \"select * from db.mymodel\";\n }\n\n if (featureToggles.mode === \"read only\") {\n sqlQuery = `--- Would like to do query here? Book a demo with us at ${RECCE_SUPPORT_CALENDAR_URL}\\n${sqlQuery}`;\n }\n\n const { showRunId } = useRecceActionContext();\n const { apiClient } = useApiConfig();\n const queryFn = async (type: \"query\" | \"query_base\" | \"query_diff\") => {\n function queryFactory(type: string) {\n switch (type) {\n case \"query\":\n return submitQuery;\n case \"query_base\":\n return submitQueryBase;\n case \"query_diff\":\n return submitQueryDiff;\n default:\n throw new Error(`Unknown query type: ${type}`);\n }\n }\n const sqlTemplate = type === \"query_base\" ? (baseSqlQuery ?? \"\") : sqlQuery;\n const runFn = queryFactory(type);\n const params: QueryParams = { sql_template: sqlTemplate };\n const options: SubmitOptions = { nowait: true };\n\n if (type === \"query_diff\") {\n params.primary_keys = primaryKeys;\n if (isCustomQueries) params.base_sql_template = baseSqlQuery;\n }\n const { run_id } = await runFn(params, options, apiClient);\n\n showRunId(run_id);\n\n return await waitRun(run_id, undefined, apiClient);\n };\n\n const { mutate: runQuery, isPending } = useMutation({\n mutationFn: queryFn,\n });\n\n const currentSchema = useMemo(() => {\n const initialValue = \"N/A\";\n // find the most common schema from the current lineage graph\n const countMap: Record<string, number> = {};\n if (!lineageGraph) {\n return initialValue;\n }\n\n for (const key in lineageGraph.nodes) {\n const schema = lineageGraph.nodes[key].data.data.current?.schema;\n if (schema) {\n countMap[schema] = (countMap[schema] || 0) + 1;\n }\n }\n // Find the most common value\n return Object.keys(countMap).reduce((mostCommon, current) => {\n if (countMap[current] > (countMap[mostCommon] || 0)) {\n return current;\n }\n return mostCommon;\n }, initialValue);\n }, [lineageGraph]);\n\n if (singleEnv || featureToggles.mode === \"metadata only\") {\n return (\n <Box sx={{ display: \"flex\", flexDirection: \"column\", height: \"100%\" }}>\n <Box\n sx={{\n display: \"flex\",\n justifyContent: \"right\",\n alignItems: \"center\",\n padding: \"4pt 8pt\",\n gap: \"5px\",\n height: \"54px\",\n borderBottom: \"1px solid\",\n borderColor: \"divider\",\n }}\n >\n <HistoryToggle />\n <Box sx={{ flexGrow: 1 }} />\n {singleEnv ? (\n <MuiTooltip\n title=\"Please configure the base environment before running the diff\"\n placement=\"left\"\n >\n <span>\n <Button\n variant=\"contained\"\n disabled\n size=\"small\"\n sx={{ fontSize: \"14px\", mt: \"16px\" }}\n >\n Run Diff\n </Button>\n </span>\n </MuiTooltip>\n ) : (\n <SetupConnectionPopover\n display={featureToggles.mode === \"metadata only\"}\n >\n <Button\n variant=\"contained\"\n disabled\n size=\"small\"\n sx={{ fontSize: \"14px\", mt: \"16px\" }}\n >\n Run Diff\n </Button>\n </SetupConnectionPopover>\n )}\n </Box>\n <DualSqlEditor\n value={sqlQuery}\n onChange={setSqlQuery}\n onRun={() => {\n runQuery(\"query\");\n }}\n labels={[\"base (production)\", `current (${currentSchema})`]}\n SetupGuide={\n featureToggles.mode === \"metadata only\" ? (\n <SetupConnectionGuide />\n ) : (\n <BaseEnvironmentSetupGuide />\n )\n }\n />\n </Box>\n );\n }\n\n return (\n <Box sx={{ display: \"flex\", flexDirection: \"column\", height: \"100%\" }}>\n <Box\n sx={{\n display: \"flex\",\n justifyContent: \"right\",\n alignItems: \"flex-end\",\n padding: \"4pt 8pt\",\n gap: \"5px\",\n height: \"54px\",\n borderBottom: \"1px solid\",\n borderColor: \"divider\",\n flex: \"0 0 54px\",\n }}\n >\n <HistoryToggle />\n <QueryModeToggle />\n <Box sx={{ flexGrow: 1 }} />\n <QueryForm\n defaultPrimaryKeys={primaryKeys}\n onPrimaryKeysChange={setPrimaryKeys}\n />\n <Button\n variant=\"contained\"\n onClick={() => {\n runQuery(\"query_diff\");\n }}\n disabled={isPending || featureToggles.disableDatabaseQuery}\n size=\"small\"\n >\n Run Diff\n </Button>\n </Box>\n\n <Box sx={{ width: \"100%\", flex: 1, overflowY: \"auto\" }}>\n {isCustomQueries ? (\n <DualSqlEditor\n value={sqlQuery}\n baseValue={baseSqlQuery}\n onChange={setSqlQuery}\n onChangeBase={setBaseSqlQuery}\n onRun={() => {\n runQuery(\"query\");\n }}\n onRunBase={() => {\n runQuery(\"query_base\");\n }}\n onRunDiff={() => {\n runQuery(\"query_diff\");\n }}\n />\n ) : (\n <SqlEditor\n value={sqlQuery}\n onChange={setSqlQuery}\n onRun={() => {\n runQuery(\"query\");\n }}\n onRunDiff={() => {\n runQuery(\"query_diff\");\n }}\n />\n )}\n </Box>\n </Box>\n );\n};\n","\"use client\";\n\n/**\n * @file GraphNodeOss.tsx\n * @description OSS wrapper for UI package LineageNode component\n *\n * This component wraps the @datarecce/ui LineageNode with OSS-specific\n * context integration. It extracts state from LineageViewContext and\n * LineageGraphContext and passes it as props to the presentation component.\n *\n * Migration: Phase 4 of lineage component migration plan\n *\n * OSS-specific functionality injected:\n * - Run type icons from registry (schema_diff, row_count_diff)\n * - ActionTag with OSS run result parsing\n * - NodeRunsAggregated with schema change detection\n */\n\nimport Box from \"@mui/material/Box\";\nimport Chip from \"@mui/material/Chip\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport { type NodeProps, useStore } from \"@xyflow/react\";\nimport { memo } from \"react\";\nimport type { LineageGraphNode } from \"../..\";\nimport { COLUMN_HEIGHT, isSchemaChanged } from \"../..\";\nimport { isRowCountDiffRun, type RowCountDiff } from \"../../api\";\nimport {\n useLineageGraphContext,\n useLineageViewContextSafe,\n} from \"../../contexts\";\nimport { useThemeColors } from \"../../hooks\";\nimport { deltaPercentageString } from \"../../utils\";\nimport { findByRunType } from \"../run\";\nimport {\n ActionTag,\n type ChangeCategory,\n LineageNode,\n type NodeChangeStatus,\n type SelectMode,\n} from \"./nodes\";\nimport { getIconForChangeStatus } from \"./styles\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type GraphNodeProps = NodeProps<LineageGraphNode>;\n\n// =============================================================================\n// HELPER COMPONENTS\n// =============================================================================\n\n/**\n * Row count diff tag component with OSS icon injection\n */\nfunction RowCountDiffTag({ rowCount }: { rowCount: RowCountDiff }) {\n const base = rowCount.base;\n const current = rowCount.curr;\n const baseLabel = rowCount.base === null ? \"N/A\" : `${rowCount.base} Rows`;\n const currentLabel = rowCount.curr === null ? \"N/A\" : `${rowCount.curr} Rows`;\n\n let tagLabel: string;\n let chipColor: \"default\" | \"success\" | \"error\";\n\n if (base === null && current === null) {\n tagLabel = \"Failed to load\";\n chipColor = \"default\";\n } else if (base === null || current === null) {\n tagLabel = `${baseLabel} -> ${currentLabel}`;\n chipColor = base === null ? \"success\" : \"error\";\n } else if (base === current) {\n tagLabel = \"=\";\n chipColor = \"default\";\n } else {\n tagLabel = `${deltaPercentageString(base, current)} Rows`;\n chipColor = base < current ? \"success\" : \"error\";\n }\n\n const RowCountIcon = findByRunType(\"row_count_diff\").icon;\n\n return (\n <Chip\n size=\"small\"\n color={chipColor}\n icon={RowCountIcon ? <RowCountIcon /> : undefined}\n label={tagLabel}\n sx={{ height: 20, fontSize: \"0.7rem\" }}\n />\n );\n}\n\n/**\n * Node runs aggregated display component with OSS-specific icons\n * Shows schema diff indicator and row count diff for models\n */\nfunction NodeRunsAggregatedDisplay({\n id,\n inverted,\n}: {\n id: string;\n inverted: boolean;\n}) {\n const { lineageGraph, runsAggregated } = useLineageGraphContext();\n const { text, isDark } = useThemeColors();\n const runs = runsAggregated?.[id];\n const node = lineageGraph?.nodes[id];\n\n if (!runs && !node) {\n return null;\n }\n\n let schemaChanged: boolean | undefined;\n if (node?.data.data.base && node.data.data.current) {\n const baseColumns = node.data.data.base.columns;\n const currColumns = node.data.data.current.columns;\n schemaChanged = isSchemaChanged(baseColumns, currColumns);\n }\n\n let rowCountChanged: boolean | undefined;\n if (runs?.row_count_diff) {\n const rowCountDiff = runs.row_count_diff;\n const result = rowCountDiff.result as RowCountDiff;\n rowCountChanged = result.curr !== result.base;\n }\n\n const colorChanged = inverted\n ? text.inverted\n : getIconForChangeStatus(\"modified\").color;\n const colorUnchanged = inverted\n ? text.secondary\n : isDark\n ? \"grey.700\"\n : \"grey.100\";\n\n const SchemaDiffIcon = findByRunType(\"schema_diff\").icon;\n\n return (\n <Box sx={{ display: \"flex\", flex: 1, alignItems: \"center\" }}>\n {schemaChanged !== undefined && (\n <MuiTooltip\n title={`Schema (${schemaChanged ? \"changed\" : \"no change\"})`}\n enterDelay={500}\n >\n <Box sx={{ height: 16 }}>\n {SchemaDiffIcon && (\n <Box\n component={SchemaDiffIcon}\n sx={{ color: schemaChanged ? colorChanged : colorUnchanged }}\n />\n )}\n </Box>\n </MuiTooltip>\n )}\n <Box sx={{ flexGrow: 1 }} />\n {runs?.row_count_diff && rowCountChanged !== undefined && (\n <MuiTooltip\n title={`Row count (${rowCountChanged ? \"changed\" : \"=\"})`}\n enterDelay={500}\n >\n <Box>\n <RowCountDiffTag\n rowCount={runs.row_count_diff.result as RowCountDiff}\n />\n </Box>\n </MuiTooltip>\n )}\n </Box>\n );\n}\n\n/**\n * Action tag display component - bridges OSS run data to UI ActionTag\n * Parses OSS-specific run results and renders using UI package ActionTag\n */\nfunction ActionTagDisplay({\n nodeId,\n nodeName,\n}: {\n nodeId: string;\n nodeName: string;\n}) {\n const { getNodeAction } = useLineageViewContextSafe();\n const action = getNodeAction(nodeId);\n\n if (!action) {\n return null;\n }\n\n const { status, skipReason, run } = action;\n\n // Map OSS action status to UI ActionTag props\n if (status === \"pending\") {\n return <ActionTag status=\"pending\" />;\n }\n\n if (status === \"skipped\") {\n return <ActionTag status=\"skipped\" skipReason={skipReason} />;\n }\n\n if (!run) {\n return <ActionTag status=\"pending\" />;\n }\n\n const { error, run_id, progress } = run;\n\n if (status === \"running\") {\n return (\n <ActionTag\n status=\"running\"\n progress={{ percentage: progress?.percentage }}\n />\n );\n }\n\n if (error) {\n return <ActionTag status=\"error\" errorMessage={error} />;\n }\n\n // Value diff result - parse OSS format to UI format\n if (run.type === \"value_diff\" && run.result) {\n const r = run.result as { data: { data: unknown[][] } };\n let mismatched = 0;\n const totalColumns = r.data.data.length;\n\n for (const c of r.data.data) {\n if ((c[2] as number) < 1) {\n mismatched++;\n }\n }\n\n return (\n <ActionTag\n status=\"success\"\n valueDiffResult={{ mismatchedColumns: mismatched, totalColumns }}\n />\n );\n }\n\n // Row count diff result - use OSS RowCountDiffTag with icon\n if (isRowCountDiffRun(run) && run.result) {\n const result = run.result;\n const nodeResult = result[nodeName];\n if (nodeResult) {\n return <RowCountDiffTag rowCount={nodeResult} />;\n }\n }\n\n // Row count result\n if (run.type === \"row_count\" && run.result) {\n const result = run.result as Record<string, { curr: number | null }>;\n const nodeResult = result[nodeName];\n if (nodeResult?.curr !== undefined && nodeResult.curr !== null) {\n return (\n <Chip\n size=\"small\"\n label={`${nodeResult.curr.toLocaleString()} Rows`}\n sx={{ height: 20, fontSize: \"0.7rem\" }}\n />\n );\n }\n }\n\n return <ActionTag status=\"success\" runId={run_id} />;\n}\n\n// =============================================================================\n// MAIN COMPONENT\n// =============================================================================\n\n/**\n * GraphNode - OSS wrapper for UI package LineageNode\n *\n * This component integrates LineageViewContext and LineageGraphContext\n * with the pure presentation LineageNode from @datarecce/ui.\n */\nfunction GraphNodeComponent(nodeProps: GraphNodeProps) {\n const { data } = nodeProps;\n const { id, resourceType, changeStatus, name } = data;\n\n // Get zoom level for content visibility\n const showContent = useStore((s) => s.transform[2] > 0.3);\n\n // Get theme colors\n const { isDark } = useThemeColors();\n\n // Get context values\n const {\n interactive,\n selectNode,\n selectMode,\n focusedNode,\n getNodeAction,\n getNodeColumnSet,\n isNodeHighlighted,\n isNodeSelected,\n isNodeShowingChangeAnalysis,\n showContextMenu,\n viewOptions,\n cll,\n showColumnLevelLineage,\n } = useLineageViewContextSafe();\n\n // Computed state\n const changeCategory = cll?.current.nodes[id]\n ?.change_category as ChangeCategory;\n const isHighlighted = isNodeHighlighted(id);\n const isSelected = isNodeSelected(id);\n const isFocusedByImpactRadius =\n viewOptions.column_level_lineage?.node_id === id &&\n viewOptions.column_level_lineage.column === undefined;\n const isFocused = focusedNode?.id === id || isFocusedByImpactRadius;\n const isShowingChangeAnalysis = isNodeShowingChangeAnalysis(id);\n const columnSet = getNodeColumnSet(data.id);\n const action =\n selectMode === \"action_result\" ? getNodeAction(data.id) : undefined;\n\n // Map to UI package types\n const nodeChangeStatus: NodeChangeStatus | undefined = changeStatus as\n | NodeChangeStatus\n | undefined;\n const nodeSelectMode: SelectMode = selectMode as SelectMode;\n\n // Create action tag if in action_result mode\n const actionTag =\n selectMode === \"action_result\" && action ? (\n <ActionTagDisplay nodeId={id} nodeName={name} />\n ) : undefined;\n\n // Create runs aggregated tag if model and not in action_result mode\n const runsAggregatedTag =\n selectMode !== \"action_result\" && data.resourceType === \"model\" ? (\n <NodeRunsAggregatedDisplay\n id={data.id}\n inverted={selectMode === \"selecting\" && isSelected}\n />\n ) : undefined;\n\n // Callbacks\n const handleSelect = (nodeId: string) => {\n selectNode(nodeId);\n };\n\n const handleContextMenu = (event: React.MouseEvent, _nodeId: string) => {\n showContextMenu(event, nodeProps as unknown as LineageGraphNode);\n };\n\n const handleShowImpactRadius = (nodeId: string) => {\n void showColumnLevelLineage({\n node_id: nodeId,\n change_analysis: true,\n no_upstream: true,\n });\n };\n\n return (\n <LineageNode\n id={id}\n data={{\n label: name,\n changeStatus: nodeChangeStatus,\n resourceType,\n }}\n // Interactive props\n interactive={interactive}\n selectMode={nodeSelectMode}\n isNodeSelected={isSelected}\n isFocused={isFocused}\n isHighlighted={isHighlighted}\n showContent={showContent}\n // Action display props\n actionTag={actionTag}\n showChangeAnalysis={isShowingChangeAnalysis}\n changeCategory={changeCategory}\n runsAggregatedTag={runsAggregatedTag}\n // Layout props\n hasParents={Object.keys(data.parents).length > 0}\n hasChildren={Object.keys(data.children).length > 0}\n columnCount={columnSet.size}\n columnHeight={COLUMN_HEIGHT}\n // Theme props\n isDark={isDark}\n // Callbacks\n onSelect={handleSelect}\n onContextMenu={handleContextMenu}\n onShowImpactRadius={\n changeStatus === \"modified\" ? handleShowImpactRadius : undefined\n }\n />\n );\n}\n\nexport const GraphNode = memo(GraphNodeComponent);\nGraphNode.displayName = \"GraphNode\";\n","import type { LineageGraphNode } from \"../../../contexts/lineage/types\";\nimport { colors } from \"../../../theme\";\nimport { GraphColumnNode } from \"../GraphColumnNodeOss\";\nimport GraphEdge from \"../GraphEdgeOss\";\nimport { GraphNode } from \"../GraphNodeOss\";\nimport { getIconForChangeStatus } from \"../styles\";\n\n/**\n * Node types configuration for ReactFlow.\n * Maps custom node type names to their React components.\n */\nexport const nodeTypes = {\n lineageGraphNode: GraphNode,\n lineageGraphColumnNode: GraphColumnNode,\n} as const;\n\n/**\n * Edge types configuration for ReactFlow.\n * Maps custom edge type names to their React components.\n */\nexport const edgeTypes = {\n lineageGraphEdge: GraphEdge,\n} as const;\n\n/**\n * Initial empty nodes array for ReactFlow initialization.\n */\nexport const initialNodes: LineageGraphNode[] = [];\n\n/**\n * Get the color for a node based on its change status.\n * Used by MiniMap for node coloring.\n *\n * @param node - The lineage graph node\n * @returns Hex color string\n */\nexport const getNodeColor = (node: LineageGraphNode): string => {\n return node.data.changeStatus\n ? getIconForChangeStatus(node.data.changeStatus).hexColor\n : colors.neutral[400];\n};\n","\"use client\";\n\n/**\n * @file LineageViewContextMenu.tsx\n * @description Context menu components for lineage graph nodes with dependency injection.\n *\n * These components provide right-click context menus for model nodes and column nodes\n * in the lineage visualization. They support:\n * - Query generation and navigation\n * - Row count, profile, value diff, and histogram diff actions\n * - Node selection (parent/child nodes)\n * - Column-level lineage (impact radius)\n *\n * The components use dependency injection for:\n * - Action execution (runAction callback)\n * - Navigation (onNavigate callback)\n * - Analytics tracking (onTrack callback)\n * - Histogram diff support checking (supportsHistogramDiff callback)\n * - Run type metadata (findByRunType callback)\n *\n * @example\n * ```tsx\n * <LineageViewContextMenu\n * x={100}\n * y={200}\n * node={selectedNode}\n * isOpen={true}\n * onClose={() => setMenuOpen(false)}\n * deps={{\n * runAction: (type, params, options) => executeAction(type, params, options),\n * onNavigate: (path) => router.push(path),\n * onTrack: (event, props) => analytics.track(event, props),\n * supportsHistogramDiff: (columnType) => checkHistogramSupport(columnType),\n * findByRunType: (type) => getRunTypeMetadata(type),\n * }}\n * />\n * ```\n */\n\nimport Box from \"@mui/material/Box\";\nimport Divider from \"@mui/material/Divider\";\nimport Menu from \"@mui/material/Menu\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport { type ReactNode, useState } from \"react\";\nimport { BiArrowFromBottom, BiArrowToBottom } from \"react-icons/bi\";\nimport { FaRegDotCircle } from \"react-icons/fa\";\nimport type { CllInput } from \"../../../api/cll\";\nimport type { SubmitRunTrackProps } from \"../../../api/runs\";\nimport {\n isLineageGraphColumnNode,\n isLineageGraphNode,\n type LineageGraphColumnNode,\n type LineageGraphNode,\n type LineageGraphNodes,\n} from \"../../../contexts/lineage/types\";\nimport { formatSelectColumns } from \"../../../utils/formatSelect\";\nimport type { IconComponent } from \"../../run/types\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Tracking event types for context menu actions\n */\nexport type ContextMenuTrackEvent = \"explore_action\" | \"lineage_selection\";\n\n/**\n * Properties for explore action tracking\n */\nexport interface ExploreActionTrackProps {\n action: string;\n source: string;\n node_count: number;\n}\n\n/**\n * Properties for lineage selection tracking\n */\nexport interface LineageSelectionTrackProps {\n action: string;\n}\n\n/**\n * Run type metadata returned by findByRunType\n */\nexport interface RunTypeMetadata {\n title: string;\n icon: IconComponent;\n}\n\n/**\n * Dependency injection props for context menu components.\n * These allow the consumer to inject OSS-specific behavior.\n */\nexport interface LineageViewContextMenuDeps {\n /**\n * Execute a run action (e.g., row_count_diff, profile_diff).\n * @param type - The run type to execute\n * @param params - Parameters for the run\n * @param options - Options including showForm and trackProps\n */\n runAction?: (\n type: string,\n params: Record<string, unknown>,\n options: { showForm: boolean; trackProps: SubmitRunTrackProps },\n ) => void;\n\n /**\n * Navigate to a path in the application.\n * @param path - The path to navigate to (e.g., \"/query\")\n */\n onNavigate?: (path: string) => void;\n\n /**\n * Track analytics events.\n * @param event - The event type\n * @param props - Event properties\n */\n onTrack?: (\n event: ContextMenuTrackEvent,\n props: ExploreActionTrackProps | LineageSelectionTrackProps,\n ) => void;\n\n /**\n * Check if histogram diff is supported for a column type.\n * @param columnType - The column data type\n * @returns true if histogram diff is supported\n */\n supportsHistogramDiff?: (columnType: string) => boolean;\n\n /**\n * Get metadata for a run type (title, icon).\n * @param type - The run type\n * @returns Run type metadata or undefined\n */\n findByRunType?: (type: string) => RunTypeMetadata | undefined;\n\n /**\n * Set the SQL query in the query context.\n * @param query - The SQL query string\n */\n setSqlQuery?: (query: string) => void;\n\n /**\n * Set the primary keys in the query context.\n * @param keys - Array of primary key column names\n */\n setPrimaryKeys?: (keys: string[] | undefined) => void;\n\n /**\n * Get the primary key for a model.\n * @param modelName - The model name\n * @returns The primary key column name or undefined\n */\n getPrimaryKey?: (modelName: string) => string | undefined;\n\n /**\n * Wrapper component for disabled menu items (e.g., SetupConnectionPopover).\n * Rendered when mode is \"metadata only\".\n */\n DisabledItemWrapper?: React.ComponentType<{\n display: boolean;\n children: ReactNode;\n }>;\n}\n\n/**\n * Context menu view options passed from LineageViewContext\n */\nexport interface ContextMenuViewOptions {\n selectMode?: \"selecting\" | \"action_result\" | undefined;\n cll?: unknown;\n showColumnLevelLineage?: (params: CllInput) => Promise<void>;\n selectParentNodes?: (nodeId: string, degree?: number) => void;\n selectChildNodes?: (nodeId: string, degree?: number) => void;\n getNodeColumnSet?: (nodeId: string) => Set<string>;\n}\n\n/**\n * Feature toggles that affect context menu behavior\n */\nexport interface ContextMenuFeatureToggles {\n disableDatabaseQuery?: boolean;\n disableViewActionDropdown?: boolean;\n mode?: string;\n}\n\n/**\n * Server flags that affect context menu behavior\n */\nexport interface ContextMenuServerFlags {\n single_env_onboarding?: boolean;\n}\n\n/**\n * Props for the main LineageViewContextMenu component\n */\nexport interface LineageViewContextMenuProps {\n x: number;\n y: number;\n node?: LineageGraphNodes;\n isOpen: boolean;\n onClose: () => void;\n deps?: LineageViewContextMenuDeps;\n viewOptions?: ContextMenuViewOptions;\n featureToggles?: ContextMenuFeatureToggles;\n serverFlags?: ContextMenuServerFlags;\n noCatalogCurrent?: boolean;\n isActionAvailable?: (actionName: string) => boolean;\n}\n\n/**\n * Props for ModelNodeContextMenu\n */\nexport interface ModelNodeContextMenuProps {\n x: number;\n y: number;\n node?: LineageGraphNode;\n isOpen: boolean;\n onClose: () => void;\n deps?: LineageViewContextMenuDeps;\n viewOptions?: ContextMenuViewOptions;\n featureToggles?: ContextMenuFeatureToggles;\n serverFlags?: ContextMenuServerFlags;\n noCatalogCurrent?: boolean;\n isActionAvailable?: (actionName: string) => boolean;\n}\n\n/**\n * Props for ColumnNodeContextMenu\n */\nexport interface ColumnNodeContextMenuProps {\n x: number;\n y: number;\n node?: LineageGraphColumnNode;\n isOpen: boolean;\n onClose: () => void;\n deps?: LineageViewContextMenuDeps;\n featureToggles?: ContextMenuFeatureToggles;\n serverFlags?: ContextMenuServerFlags;\n isActionAvailable?: (actionName: string) => boolean;\n}\n\n// ============================================================================\n// Internal Types\n// ============================================================================\n\ninterface ContextMenuItem {\n label?: string;\n itemIcon?: ReactNode;\n action?: () => void;\n isDisabled?: boolean;\n isSeparator?: boolean;\n}\n\ninterface ContextMenuProps {\n menuItems: ContextMenuItem[];\n open: boolean;\n onClose: () => void;\n x: number;\n y: number;\n featureToggles?: ContextMenuFeatureToggles;\n DisabledItemWrapper?: React.ComponentType<{\n display: boolean;\n children: ReactNode;\n }>;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Explore action constants\n */\nexport const EXPLORE_ACTION = {\n ROW_COUNT: \"row_count\",\n ROW_COUNT_DIFF: \"row_count_diff\",\n PROFILE: \"profile\",\n PROFILE_DIFF: \"profile_diff\",\n VALUE_DIFF: \"value_diff\",\n HISTOGRAM_DIFF: \"histogram_diff\",\n TOP_K_DIFF: \"top_k_diff\",\n} as const;\n\n/**\n * Explore source constants\n */\nexport const EXPLORE_SOURCE = {\n LINEAGE_VIEW_CONTEXT_MENU: \"lineage_view_context_menu\",\n} as const;\n\n/**\n * Lineage selection action constants\n */\nexport const LINEAGE_SELECTION_ACTION = {\n SELECT_PARENT_NODES: \"select_parent_nodes\",\n SELECT_CHILD_NODES: \"select_child_nodes\",\n SELECT_ALL_UPSTREAM: \"select_all_upstream\",\n SELECT_ALL_DOWNSTREAM: \"select_all_downstream\",\n} as const;\n\n// ============================================================================\n// Internal Components\n// ============================================================================\n\n/**\n * Base context menu component that renders the MUI Menu with items.\n */\nconst ContextMenu = ({\n menuItems,\n open,\n onClose,\n x,\n y,\n featureToggles,\n DisabledItemWrapper,\n}: ContextMenuProps) => {\n // Default wrapper that just renders children\n const Wrapper =\n DisabledItemWrapper ??\n (({ children }: { children: ReactNode }) => <>{children}</>);\n const isMetadataOnlyMode = featureToggles?.mode === \"metadata only\";\n\n return (\n <Menu\n open={open}\n onClose={onClose}\n anchorReference=\"anchorPosition\"\n anchorPosition={{ top: y, left: x }}\n slotProps={{\n paper: {\n sx: { fontSize: \"0.85rem\", width: \"250px\" },\n },\n }}\n >\n {menuItems.length === 0 ? (\n <MenuItem disabled key=\"no action\">\n No action available\n </MenuItem>\n ) : (\n menuItems.map(\n ({ isSeparator, label, isDisabled, action, itemIcon }) => {\n if (isSeparator) {\n return <Divider key={label} />;\n }\n\n const menuItem = (\n <MenuItem\n key={label}\n disabled={isDisabled}\n onClick={() => {\n if (action) {\n action();\n }\n onClose();\n }}\n >\n {itemIcon} {label}\n </MenuItem>\n );\n\n // Wrap disabled items with DisabledItemWrapper if provided\n if (isDisabled && DisabledItemWrapper) {\n return (\n <Wrapper display={isMetadataOnlyMode} key={label}>\n {menuItem}\n </Wrapper>\n );\n }\n\n return menuItem;\n },\n )\n )}\n </Menu>\n );\n};\n\n// ============================================================================\n// Public Components\n// ============================================================================\n\n/**\n * Context menu for model/node right-click actions.\n *\n * Shows menu items for:\n * - Show Impact Radius (for modified nodes)\n * - Query / Query Related Columns / Query Modified Columns\n * - Row Count / Row Count Diff\n * - Profile / Profile Diff\n * - Value Diff\n * - Select Parent/Child Nodes\n */\nexport const ModelNodeContextMenu = ({\n isOpen,\n onClose,\n x,\n y,\n node,\n deps = {},\n viewOptions = {},\n featureToggles = {},\n serverFlags = {},\n noCatalogCurrent = false,\n isActionAvailable = () => true,\n}: ModelNodeContextMenuProps) => {\n const menuItems: ContextMenuItem[] = [];\n\n const {\n runAction,\n onNavigate,\n onTrack,\n findByRunType,\n setSqlQuery,\n setPrimaryKeys,\n getPrimaryKey,\n DisabledItemWrapper,\n } = deps;\n\n const {\n selectMode,\n cll,\n showColumnLevelLineage,\n selectParentNodes,\n selectChildNodes,\n getNodeColumnSet,\n } = viewOptions;\n\n const singleEnv = serverFlags.single_env_onboarding ?? false;\n const isQueryDisabled = featureToggles.disableDatabaseQuery ?? false;\n\n if (!node?.data) {\n return <></>;\n }\n\n const modelNode = node.data;\n const resourceType = modelNode.resourceType;\n const columns = getNodeColumnSet ? Array.from(getNodeColumnSet(node.id)) : [];\n const trackProps: SubmitRunTrackProps = {\n source: \"lineage_model_node\",\n };\n const changeStatus = modelNode.changeStatus;\n const primaryKey = getPrimaryKey?.(modelNode.name);\n\n // Show Impact Radius for modified nodes\n if (changeStatus === \"modified\") {\n menuItems.push({\n label: \"Show Impact Radius\",\n itemIcon: <FaRegDotCircle />,\n isDisabled: noCatalogCurrent,\n action: () => {\n void showColumnLevelLineage?.({\n node_id: node.id,\n change_analysis: true,\n no_upstream: true,\n });\n },\n });\n }\n\n // Query actions for model/seed/snapshot resource types\n if (\n !selectMode &&\n resourceType &&\n [\"model\", \"seed\", \"snapshot\"].includes(resourceType)\n ) {\n if (menuItems.length > 0) {\n menuItems.push({\n label: \"select group one\",\n isSeparator: true,\n });\n }\n\n // Query action\n const queryRunType = singleEnv ? \"query\" : \"query_diff\";\n const queryRun = findByRunType?.(queryRunType);\n const baseColumns = Object.keys(modelNode.data.base?.columns ?? {});\n const currentColumns = Object.keys(modelNode.data.current?.columns ?? {});\n const formattedColumns = formatSelectColumns(baseColumns, currentColumns);\n let query = `select * from {{ ref(\"${modelNode.name}\") }}`;\n if (formattedColumns.length) {\n query = `select \\n ${formattedColumns.join(\"\\n \")}\\nfrom {{ ref(\"${modelNode.name}\") }}`;\n }\n\n if (queryRun) {\n menuItems.push({\n label: \"Query\",\n itemIcon: (\n <Box component={queryRun.icon} sx={{ display: \"inline-flex\" }} />\n ),\n isDisabled: isQueryDisabled,\n action: () => {\n setSqlQuery?.(query);\n if (isActionAvailable(\"query_diff_with_primary_key\")) {\n setPrimaryKeys?.(\n primaryKey !== undefined ? [primaryKey] : undefined,\n );\n }\n onNavigate?.(\"/query\");\n },\n });\n }\n\n // Query Related Columns (when CLL is active)\n if (columns.length > 0 && queryRun) {\n if (cll !== undefined) {\n const allColumns = new Set<string>();\n if (primaryKey) {\n allColumns.add(primaryKey);\n }\n columns.forEach((column) => {\n allColumns.add(column);\n });\n\n menuItems.push({\n label: \"Query Related Columns\",\n itemIcon: (\n <Box component={queryRun.icon} sx={{ display: \"inline-flex\" }} />\n ),\n isDisabled: isQueryDisabled,\n action: () => {\n const relatedQuery = `select \\n ${Array.from(allColumns).join(\",\\n \")}\\nfrom {{ ref(\"${modelNode.name}\") }}`;\n setSqlQuery?.(relatedQuery);\n if (isActionAvailable(\"query_diff_with_primary_key\")) {\n setPrimaryKeys?.(\n primaryKey !== undefined ? [primaryKey] : undefined,\n );\n }\n onNavigate?.(\"/query\");\n },\n });\n } else {\n // Query Modified Columns\n const changedColumns = Object.entries(modelNode.change?.columns ?? {})\n .filter(([, value]) => value === \"modified\")\n .map(([key]) => key);\n if (changedColumns.length > 0) {\n const allColumns = new Set<string>();\n if (primaryKey) {\n allColumns.add(primaryKey);\n }\n changedColumns.forEach((column) => {\n allColumns.add(column);\n });\n\n menuItems.push({\n label: \"Query Modified Columns\",\n itemIcon: (\n <Box component={queryRun.icon} sx={{ display: \"inline-flex\" }} />\n ),\n isDisabled: isQueryDisabled,\n action: () => {\n const modifiedQuery = `select \\n ${Array.from(allColumns).join(\",\\n \")}\\nfrom {{ ref(\"${modelNode.name}\") }}`;\n setSqlQuery?.(modifiedQuery);\n if (isActionAvailable(\"query_diff_with_primary_key\")) {\n setPrimaryKeys?.(\n primaryKey !== undefined ? [primaryKey] : undefined,\n );\n }\n onNavigate?.(\"/query\");\n },\n });\n }\n }\n }\n\n // Row Count / Row Count Diff\n const rowCountRunType = singleEnv ? \"row_count\" : \"row_count_diff\";\n const rowCountRun = findByRunType?.(rowCountRunType);\n if (rowCountRun) {\n menuItems.push({\n label: rowCountRun.title,\n itemIcon: (\n <Box component={rowCountRun.icon} sx={{ display: \"inline-flex\" }} />\n ),\n isDisabled: isQueryDisabled,\n action: () => {\n onTrack?.(\"explore_action\", {\n action: singleEnv\n ? EXPLORE_ACTION.ROW_COUNT\n : EXPLORE_ACTION.ROW_COUNT_DIFF,\n source: EXPLORE_SOURCE.LINEAGE_VIEW_CONTEXT_MENU,\n node_count: 1,\n });\n runAction?.(\n rowCountRunType,\n { node_names: [modelNode.name] },\n { showForm: false, trackProps },\n );\n },\n });\n }\n\n // Profile / Profile Diff\n const profileRunType = singleEnv ? \"profile\" : \"profile_diff\";\n const profileRun = findByRunType?.(profileRunType);\n if (profileRun) {\n menuItems.push({\n label: profileRun.title,\n itemIcon: (\n <Box component={profileRun.icon} sx={{ display: \"inline-flex\" }} />\n ),\n isDisabled: isQueryDisabled,\n action: () => {\n const profileColumns = getNodeColumnSet\n ? Array.from(getNodeColumnSet(node.id))\n : [];\n onTrack?.(\"explore_action\", {\n action: singleEnv\n ? EXPLORE_ACTION.PROFILE\n : EXPLORE_ACTION.PROFILE_DIFF,\n source: EXPLORE_SOURCE.LINEAGE_VIEW_CONTEXT_MENU,\n node_count: 1,\n });\n runAction?.(\n profileRunType,\n { model: modelNode.name, columns: profileColumns },\n { showForm: true, trackProps },\n );\n },\n });\n }\n\n // Value Diff (multi-env only)\n if (!singleEnv) {\n const valueDiffRun = findByRunType?.(\"value_diff\");\n if (valueDiffRun) {\n menuItems.push({\n label: valueDiffRun.title,\n itemIcon: (\n <Box\n component={valueDiffRun.icon}\n sx={{ display: \"inline-flex\" }}\n />\n ),\n isDisabled: isQueryDisabled,\n action: () => {\n const valueDiffColumns = getNodeColumnSet\n ? Array.from(getNodeColumnSet(node.id))\n : [];\n onTrack?.(\"explore_action\", {\n action: EXPLORE_ACTION.VALUE_DIFF,\n source: EXPLORE_SOURCE.LINEAGE_VIEW_CONTEXT_MENU,\n node_count: 1,\n });\n runAction?.(\n \"value_diff\",\n { model: modelNode.name, columns: valueDiffColumns },\n { showForm: true, trackProps },\n );\n },\n });\n }\n }\n }\n\n // Select Parent/Child Nodes (multi-env only)\n if (!singleEnv) {\n if (menuItems.length > 0) {\n menuItems.push({\n label: \"select group two\",\n isSeparator: true,\n });\n }\n menuItems.push({\n label: \"Select Parent Nodes\",\n itemIcon: <BiArrowFromBottom />,\n action: () => {\n onTrack?.(\"lineage_selection\", {\n action: LINEAGE_SELECTION_ACTION.SELECT_PARENT_NODES,\n });\n selectParentNodes?.(node.id, 1);\n },\n });\n menuItems.push({\n label: \"Select Child Nodes\",\n itemIcon: <BiArrowToBottom />,\n action: () => {\n onTrack?.(\"lineage_selection\", {\n action: LINEAGE_SELECTION_ACTION.SELECT_CHILD_NODES,\n });\n selectChildNodes?.(node.id, 1);\n },\n });\n menuItems.push({\n label: \"Select All Upstream Nodes\",\n itemIcon: <BiArrowFromBottom />,\n action: () => {\n onTrack?.(\"lineage_selection\", {\n action: LINEAGE_SELECTION_ACTION.SELECT_ALL_UPSTREAM,\n });\n selectParentNodes?.(node.id);\n },\n });\n menuItems.push({\n label: \"Select All Downstream Nodes\",\n itemIcon: <BiArrowToBottom />,\n action: () => {\n onTrack?.(\"lineage_selection\", {\n action: LINEAGE_SELECTION_ACTION.SELECT_ALL_DOWNSTREAM,\n });\n selectChildNodes?.(node.id);\n },\n });\n }\n\n return (\n <ContextMenu\n x={x}\n y={y}\n menuItems={menuItems}\n open={isOpen}\n onClose={onClose}\n featureToggles={featureToggles}\n DisabledItemWrapper={DisabledItemWrapper}\n />\n );\n};\n\n/**\n * Context menu for column node right-click actions.\n *\n * Shows menu items for:\n * - Profile / Profile Diff\n * - Histogram Diff\n * - Top-K Diff\n * - Value Diff\n */\nexport const ColumnNodeContextMenu = ({\n isOpen,\n onClose,\n x,\n y,\n node,\n deps = {},\n featureToggles = {},\n serverFlags = {},\n isActionAvailable = () => true,\n}: ColumnNodeContextMenuProps) => {\n const menuItems: ContextMenuItem[] = [];\n\n const {\n runAction,\n onTrack,\n findByRunType,\n supportsHistogramDiff: checkHistogramSupport,\n DisabledItemWrapper,\n } = deps;\n\n const singleEnv = serverFlags.single_env_onboarding ?? false;\n const isQueryDisabled = featureToggles.disableDatabaseQuery ?? false;\n\n if (node?.data === undefined) {\n return <></>;\n }\n\n const columnNode = node.data;\n const modelNode = columnNode.node;\n const column = columnNode.column;\n const columnType = columnNode.type;\n const trackProps: SubmitRunTrackProps = {\n source: \"lineage_column_node\",\n };\n\n const handleProfileDiff = () => {\n onTrack?.(\"explore_action\", {\n action: EXPLORE_ACTION.PROFILE_DIFF,\n source: EXPLORE_SOURCE.LINEAGE_VIEW_CONTEXT_MENU,\n node_count: 1,\n });\n runAction?.(\n \"profile_diff\",\n { model: modelNode.name, columns: [column] },\n { showForm: false, trackProps },\n );\n };\n\n const handleHistogramDiff = () => {\n onTrack?.(\"explore_action\", {\n action: EXPLORE_ACTION.HISTOGRAM_DIFF,\n source: EXPLORE_SOURCE.LINEAGE_VIEW_CONTEXT_MENU,\n node_count: 1,\n });\n runAction?.(\n \"histogram_diff\",\n { model: modelNode.name, column_name: column, column_type: columnType },\n { showForm: false, trackProps },\n );\n };\n\n const handleTopkDiff = () => {\n onTrack?.(\"explore_action\", {\n action: EXPLORE_ACTION.TOP_K_DIFF,\n source: EXPLORE_SOURCE.LINEAGE_VIEW_CONTEXT_MENU,\n node_count: 1,\n });\n runAction?.(\n \"top_k_diff\",\n { model: modelNode.name, column_name: column, k: 50 },\n { showForm: false, trackProps },\n );\n };\n\n const handleValueDiff = () => {\n onTrack?.(\"explore_action\", {\n action: EXPLORE_ACTION.VALUE_DIFF,\n source: EXPLORE_SOURCE.LINEAGE_VIEW_CONTEXT_MENU,\n node_count: 1,\n });\n runAction?.(\n \"value_diff\",\n { model: modelNode.name, columns: [column] },\n { showForm: true, trackProps },\n );\n };\n\n const addedOrRemoved =\n modelNode.data.base?.columns?.[column] === undefined ||\n modelNode.data.current?.columns?.[column] === undefined;\n\n // Profile / Profile Diff\n const profileRunType = singleEnv ? \"profile\" : \"profile_diff\";\n const profileRun = findByRunType?.(profileRunType);\n if (profileRun) {\n menuItems.push({\n label: profileRun.title,\n itemIcon: (\n <Box component={profileRun.icon} sx={{ display: \"inline-flex\" }} />\n ),\n action: handleProfileDiff,\n isDisabled:\n addedOrRemoved || !isActionAvailable(\"profile_diff\") || isQueryDisabled,\n });\n }\n\n // Histogram Diff, Top-K Diff, Value Diff (multi-env only)\n if (!singleEnv) {\n const histogramRun = findByRunType?.(\"histogram_diff\");\n if (histogramRun) {\n const histogramSupported = checkHistogramSupport?.(columnType) ?? true;\n menuItems.push({\n label: histogramRun.title,\n itemIcon: (\n <Box component={histogramRun.icon} sx={{ display: \"inline-flex\" }} />\n ),\n action: handleHistogramDiff,\n isDisabled: addedOrRemoved || !histogramSupported || isQueryDisabled,\n });\n }\n\n const topKRun = findByRunType?.(\"top_k_diff\");\n if (topKRun) {\n menuItems.push({\n label: topKRun.title,\n itemIcon: (\n <Box component={topKRun.icon} sx={{ display: \"inline-flex\" }} />\n ),\n action: handleTopkDiff,\n isDisabled: addedOrRemoved || isQueryDisabled,\n });\n }\n\n const valueDiffRun = findByRunType?.(\"value_diff\");\n if (valueDiffRun) {\n menuItems.push({\n label: valueDiffRun.title,\n itemIcon: (\n <Box component={valueDiffRun.icon} sx={{ display: \"inline-flex\" }} />\n ),\n action: handleValueDiff,\n isDisabled: addedOrRemoved || isQueryDisabled,\n });\n }\n }\n\n return (\n <ContextMenu\n x={x}\n y={y}\n menuItems={menuItems}\n open={isOpen}\n onClose={onClose}\n featureToggles={featureToggles}\n DisabledItemWrapper={DisabledItemWrapper}\n />\n );\n};\n\n/**\n * Main context menu component that delegates to ModelNodeContextMenu\n * or ColumnNodeContextMenu based on node type.\n *\n * @example\n * ```tsx\n * <LineageViewContextMenu\n * x={event.clientX}\n * y={event.clientY}\n * node={selectedNode}\n * isOpen={menuOpen}\n * onClose={() => setMenuOpen(false)}\n * deps={contextMenuDeps}\n * viewOptions={lineageViewOptions}\n * featureToggles={featureToggles}\n * serverFlags={serverFlags}\n * noCatalogCurrent={!catalog?.current}\n * isActionAvailable={isActionAvailable}\n * />\n * ```\n */\nexport const LineageViewContextMenu = ({\n isOpen,\n onClose,\n x,\n y,\n node,\n deps = {},\n viewOptions = {},\n featureToggles = {},\n serverFlags = {},\n noCatalogCurrent = false,\n isActionAvailable = () => true,\n}: LineageViewContextMenuProps) => {\n if (featureToggles.disableViewActionDropdown) {\n return (\n <ContextMenu\n menuItems={[]}\n open={isOpen}\n onClose={onClose}\n x={x}\n y={y}\n featureToggles={featureToggles}\n DisabledItemWrapper={deps.DisabledItemWrapper}\n />\n );\n }\n\n if (node && isLineageGraphNode(node)) {\n return (\n <ModelNodeContextMenu\n x={x}\n y={y}\n isOpen={isOpen}\n onClose={onClose}\n node={node}\n deps={deps}\n viewOptions={viewOptions}\n featureToggles={featureToggles}\n serverFlags={serverFlags}\n noCatalogCurrent={noCatalogCurrent}\n isActionAvailable={isActionAvailable}\n />\n );\n }\n\n if (node && isLineageGraphColumnNode(node)) {\n return (\n <ColumnNodeContextMenu\n x={x}\n y={y}\n isOpen={isOpen}\n onClose={onClose}\n node={node}\n deps={deps}\n featureToggles={featureToggles}\n serverFlags={serverFlags}\n isActionAvailable={isActionAvailable}\n />\n );\n }\n\n return null;\n};\n\n/**\n * Hook to manage context menu state.\n * Returns props for LineageViewContextMenu and methods to show/close the menu.\n *\n * @example\n * ```tsx\n * const { props, showContextMenu, closeContextMenu } = useLineageViewContextMenu();\n *\n * const handleNodeContextMenu = (event: React.MouseEvent, node: LineageGraphNodes) => {\n * event.preventDefault();\n * showContextMenu(event.clientX, event.clientY, node);\n * };\n *\n * return (\n * <>\n * <LineageCanvas onNodeContextMenu={handleNodeContextMenu} />\n * <LineageViewContextMenu {...props} deps={deps} />\n * </>\n * );\n * ```\n */\nexport const useLineageViewContextMenu = () => {\n const [open, setOpen] = useState(false);\n const onOpen = () => setOpen(true);\n const onClose = () => setOpen(false);\n const [position, setPosition] = useState<{ x: number; y: number }>({\n x: 0,\n y: 0,\n });\n const [node, setNode] = useState<LineageGraphNodes>();\n\n const showContextMenu = (x: number, y: number, node: LineageGraphNodes) => {\n setPosition({ x, y });\n setNode(node);\n onOpen();\n };\n\n const closeContextMenu = () => {\n setPosition({ x: 0, y: 0 });\n setNode(undefined);\n onClose();\n };\n\n const props: Pick<\n LineageViewContextMenuProps,\n \"x\" | \"y\" | \"node\" | \"isOpen\" | \"onClose\"\n > = {\n x: position.x,\n y: position.y,\n node,\n isOpen: open,\n onClose,\n };\n\n return {\n props,\n showContextMenu,\n closeContextMenu,\n };\n};\n","import {\n IGNORE_SCREENSHOT_CLASS,\n useClipBoardToast,\n useCopyToClipboard,\n useThemeColors,\n} from \"../../../hooks\";\nimport { colors } from \"../../../theme\";\n\n/**\n * Hook that provides clipboard functionality for the lineage view.\n * Wraps useCopyToClipboard with lineage-specific configuration.\n *\n * @returns Object containing copyToClipboard function, ImageDownloadModal component, and ref\n */\nexport const useLineageCopyToClipboard = () => {\n const { isDark } = useThemeColors();\n const { successToast, failToast } = useClipBoardToast();\n\n return useCopyToClipboard({\n renderLibrary: \"html-to-image\",\n imageType: \"png\",\n shadowEffect: true,\n backgroundColor: isDark ? colors.neutral[900] : colors.neutral[50],\n ignoreElements: (element: Element) => {\n try {\n return element.classList.contains(IGNORE_SCREENSHOT_CLASS);\n } catch {\n if (element.className) {\n return element.className.includes(IGNORE_SCREENSHOT_CLASS);\n }\n return false;\n }\n },\n onSuccess: () => {\n successToast(\"Copied the Lineage View as an image to clipboard\");\n },\n onError: (error) => {\n console.error(\"Error taking screenshot\", error);\n failToast(\"Failed to copy image to clipboard\", error);\n },\n });\n};\n","import { useRouter } from \"next/navigation\";\nimport { useCallback } from \"react\";\nimport type { Check } from \"../../../api\";\nimport { useRouteConfig } from \"../../../contexts\";\n\n/**\n * Hook that provides navigation to a check's detail page.\n *\n * Uses the app router to navigate to /checks/?id={check_id}\n *\n * @returns A function that navigates to the given check's detail page\n */\nexport const useNavToCheck = () => {\n const router = useRouter();\n const { basePath } = useRouteConfig();\n\n return useCallback(\n (check: Check) => {\n if (check.check_id) {\n router.push(`${basePath}/checks/?id=${check.check_id}`);\n }\n },\n [router.push, basePath],\n );\n};\n","import type { RefObject } from \"react\";\nimport { useEffect, useRef } from \"react\";\n\n/**\n * Hook that observes element resize and calls a handler when the size changes\n * significantly (more than 10px difference in width or height).\n *\n * Used to trigger layout updates when the lineage view container is resized.\n *\n * @param ref - RefObject pointing to the HTML element to observe\n * @param handler - Callback function to invoke when resize is detected\n */\nexport const useResizeObserver = (\n ref: RefObject<HTMLElement | null>,\n handler: () => void,\n) => {\n const size = useRef({\n width: 0,\n height: 0,\n });\n\n useEffect(() => {\n const target = ref.current;\n const handleResize = (entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const newWidth = entry.contentRect.width;\n const newHeight = entry.contentRect.height;\n\n if (\n Math.abs(newHeight - size.current.height) > 10 ||\n Math.abs(newWidth - size.current.width) > 10\n ) {\n if (\n size.current.height > 0 &&\n newHeight > 0 &&\n size.current.width > 0 &&\n newWidth > 0\n ) {\n handler();\n }\n }\n size.current = {\n width: newWidth,\n height: newHeight,\n };\n }\n };\n\n const resizeObserver = new ResizeObserver(handleResize);\n\n if (target) {\n resizeObserver.observe(target);\n }\n\n return () => {\n if (target) {\n resizeObserver.unobserve(target);\n }\n };\n }, [handler, ref]);\n};\n","import { useCallback } from \"react\";\nimport type { LineageGraphNodes } from \"../../../contexts/lineage/types\";\nimport { isLineageGraphNode } from \"../../../contexts/lineage/types\";\nimport {\n type LineageViewRenderProps,\n trackLineageViewRender,\n} from \"../../../lib/api/track\";\n\n/**\n * Hook that provides a function to track lineage view render events.\n * Calculates node statistics and sends tracking data.\n *\n * @returns A memoized callback function for tracking lineage renders\n */\nexport const useTrackLineageRender = () => {\n return useCallback(\n (\n nodes: LineageGraphNodes[],\n currentViewMode: string,\n impactRadiusEnabled: boolean,\n cllColumnActive: boolean,\n rightSidebarOpen: boolean,\n ) => {\n const lineageGraphNodesOnly = nodes.filter(isLineageGraphNode);\n const grouped = Object.groupBy(\n lineageGraphNodesOnly,\n (node) => node.data.changeStatus ?? \"unchanged\",\n );\n // Prefix status counts with \"nodes_\"\n const statusCounts = Object.fromEntries(\n Object.entries(grouped).map(([status, nodes]) => [\n `nodes_${status}`,\n nodes?.length ?? 0,\n ]),\n );\n const trackingData = {\n node_count: lineageGraphNodesOnly.length,\n view_mode: currentViewMode,\n impact_radius_enabled: impactRadiusEnabled,\n right_sidebar_open: rightSidebarOpen,\n ...statusCounts,\n } as LineageViewRenderProps;\n // Only include cll_column_active when a column is being viewed\n if (cllColumnActive) {\n trackingData.cll_column_active = true;\n }\n trackLineageViewRender(trackingData);\n },\n [],\n );\n};\n","/**\n * @file useMultiNodesActionOss.ts\n * @description OSS wrapper for useMultiNodesAction hook.\n *\n * This wraps the base hook and adds Amplitude tracking.\n *\n * @see useMultiNodesAction for the base implementation\n */\n\nimport type { LineageGraphNode } from \"../index\";\nimport {\n EXPLORE_ACTION,\n EXPLORE_SOURCE,\n trackExploreAction,\n} from \"../lib/api/track\";\nimport {\n type MultiNodesActionCallbacks,\n type MultiNodesActionTrackProps,\n useMultiNodesAction as useMultiNodesActionBase,\n} from \"./useMultiNodesAction\";\n\n/**\n * Maps the generic action type to OSS-specific tracking constants.\n * This allows the base hook to use generic action names while\n * OSS uses its specific Amplitude tracking events.\n */\nconst actionTypeToExploreAction = {\n row_count: EXPLORE_ACTION.ROW_COUNT,\n row_count_diff: EXPLORE_ACTION.ROW_COUNT_DIFF,\n value_diff: EXPLORE_ACTION.VALUE_DIFF,\n} as const;\n\n/**\n * Tracking callback implementation for OSS.\n * Translates generic action tracking to Amplitude events.\n */\nconst handleTrackAction = (props: MultiNodesActionTrackProps) => {\n const exploreAction = actionTypeToExploreAction[props.action];\n if (exploreAction) {\n trackExploreAction({\n action: exploreAction,\n source: EXPLORE_SOURCE.LINEAGE_VIEW_TOP_BAR,\n node_count: props.node_count,\n });\n }\n};\n\n/**\n * OSS wrapper for useMultiNodesAction that provides Amplitude tracking.\n *\n * @param nodes - Array of lineage graph nodes to operate on\n * @param callbacks - Lifecycle callbacks for action execution\n * @returns Object containing action state and operation methods\n */\nexport const useMultiNodesActionOss = (\n nodes: LineageGraphNode[],\n callbacks: MultiNodesActionCallbacks,\n) => {\n return useMultiNodesActionBase(nodes, {\n ...callbacks,\n onTrackAction: handleTrackAction,\n trackingSource: EXPLORE_SOURCE.LINEAGE_VIEW_TOP_BAR,\n });\n};\n","\"use client\";\n\n/**\n * @file useValueDiffAlertDialogOss.tsx\n * @description OSS wrapper for useValueDiffAlertDialog that adds tracking.\n *\n * This is a thin wrapper around the base hook that injects\n * tracking callbacks for analytics.\n */\n\nimport {\n EXPLORE_ACTION,\n EXPLORE_FORM_EVENT,\n trackExploreActionForm,\n} from \"../lib/api/track\";\nimport { useValueDiffAlertDialog as useBaseDialog } from \"./useValueDiffAlertDialog\";\n\n/**\n * Hook for displaying a value diff confirmation dialog with tracking.\n *\n * This wrapper adds tracking callbacks to the base hook.\n */\nfunction useValueDiffAlertDialogOss() {\n return useBaseDialog({\n onConfirm: () =>\n trackExploreActionForm({\n action: EXPLORE_ACTION.VALUE_DIFF,\n event: EXPLORE_FORM_EVENT.EXECUTE,\n }),\n onCancel: () =>\n trackExploreActionForm({\n action: EXPLORE_ACTION.VALUE_DIFF,\n event: EXPLORE_FORM_EVENT.CANCEL,\n }),\n });\n}\n\nexport default useValueDiffAlertDialogOss;\n","\"use client\";\n\nimport Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport React, { useState } from \"react\";\nimport { IoClose } from \"react-icons/io5\";\nimport { SESSION_STORAGE_KEYS } from \"../../api\";\n\nexport interface NotificationProps {\n notification?: React.ReactNode;\n type: \"info\" | \"success\" | \"warning\" | \"error\";\n}\n\nexport function LineageViewNotification({\n notification,\n type,\n}: NotificationProps) {\n const notificationKey = SESSION_STORAGE_KEYS.lineageNotificationDismissed;\n\n // Initialize state from sessionStorage (lazy initialization)\n const [visible, setVisible] = useState(() => {\n const dismissed = sessionStorage.getItem(notificationKey);\n return dismissed !== \"true\";\n });\n\n if (notification === null || !visible) {\n return null;\n }\n\n const bgColor = {\n info: \"iochmara.light\",\n success: \"success.light\",\n warning: \"warning.light\",\n error: \"error.light\",\n }[type];\n\n return (\n <Box\n sx={{\n width: \"100%\",\n display: \"flex\",\n flexDirection: \"row\",\n p: \"5px 10px\",\n gap: \"5px\",\n alignItems: \"flex-start\",\n borderRadius: 1,\n boxShadow: 4,\n border: \"1px solid\",\n borderColor: \"neutral.light\",\n bgcolor: bgColor,\n }}\n >\n {notification}\n <Box sx={{ flex: 1 }} />\n <IconButton\n size=\"small\"\n onClick={() => {\n sessionStorage.setItem(notificationKey, \"true\");\n setVisible(false);\n }}\n >\n <IoClose />\n </IconButton>\n </Box>\n );\n}\n","\"use client\";\n\n/**\n * @file LineageViewContextMenuOss.tsx\n * @description Thin wrapper that imports from @datarecce/ui and injects OSS-specific implementations.\n *\n * This file serves as the integration layer between the @datarecce/ui library and the OSS application.\n * It injects:\n * - Amplitude analytics tracking\n * - Application routing\n * - Query context management\n * - Run type registry\n * - Histogram diff support checking\n */\n\nimport { useRouter } from \"next/navigation\";\nimport type {\n LineageGraphColumnNode,\n LineageGraphNode,\n LineageGraphNodes,\n} from \"../..\";\nimport {\n useLineageGraphContext,\n useLineageViewContextSafe,\n useRecceActionContext,\n useRecceInstanceContext,\n useRecceServerFlag,\n useRouteConfig,\n} from \"../../contexts\";\nimport { useModelColumns, useRecceQueryContext } from \"../../hooks\";\nimport { trackExploreAction, trackLineageSelection } from \"../../lib/api/track\";\nimport { SetupConnectionPopover } from \"../app\";\nimport { supportsHistogramDiff } from \"../histogram\";\nimport { findByRunType } from \"../run\";\nimport {\n ColumnNodeContextMenu as BaseColumnNodeContextMenu,\n LineageViewContextMenu as BaseLineageViewContextMenu,\n ModelNodeContextMenu as BaseModelNodeContextMenu,\n useLineageViewContextMenu as baseUseLineageViewContextMenu,\n EXPLORE_ACTION,\n EXPLORE_SOURCE,\n LINEAGE_SELECTION_ACTION,\n type LineageViewContextMenuDeps,\n} from \"./contextmenu\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface LineageViewContextMenuProps<T> {\n x: number;\n y: number;\n node?: T;\n isOpen: boolean;\n onClose: () => void;\n}\n\n// ============================================================================\n// Internal Hooks\n// ============================================================================\n\n/**\n * Hook to create the dependency injection props for context menu components.\n * Wires up OSS-specific implementations for tracking, navigation, etc.\n */\nconst useContextMenuDeps = (modelName?: string): LineageViewContextMenuDeps => {\n const { runAction } = useRecceActionContext();\n const { setSqlQuery, setPrimaryKeys } = useRecceQueryContext();\n const router = useRouter();\n const { primaryKey } = useModelColumns(modelName);\n const { basePath } = useRouteConfig();\n\n return {\n runAction: (type, params, options) => {\n runAction(type, params as Parameters<typeof runAction>[1], options);\n },\n onNavigate: (path) => {\n router.push(`${basePath}${path}`);\n },\n onTrack: (event, props) => {\n if (event === \"explore_action\") {\n trackExploreAction({\n action: (props as { action: string })\n .action as (typeof EXPLORE_ACTION)[keyof typeof EXPLORE_ACTION],\n source: EXPLORE_SOURCE.LINEAGE_VIEW_CONTEXT_MENU,\n node_count: (props as { node_count: number }).node_count,\n });\n } else if (event === \"lineage_selection\") {\n trackLineageSelection({\n action: (props as { action: string })\n .action as (typeof LINEAGE_SELECTION_ACTION)[keyof typeof LINEAGE_SELECTION_ACTION],\n });\n }\n },\n supportsHistogramDiff,\n findByRunType: (type) => {\n const entry = findByRunType(type as Parameters<typeof findByRunType>[0]);\n return entry ? { title: entry.title, icon: entry.icon } : undefined;\n },\n setSqlQuery,\n setPrimaryKeys,\n getPrimaryKey: () => primaryKey,\n // Note: SetupConnectionPopover has a more restrictive children type (ReactElement vs ReactNode)\n // but it works correctly in practice since we always pass MenuItem elements\n DisabledItemWrapper:\n SetupConnectionPopover as LineageViewContextMenuDeps[\"DisabledItemWrapper\"],\n };\n};\n\n// ============================================================================\n// Exported Components\n// ============================================================================\n\n/**\n * OSS wrapper for ModelNodeContextMenu.\n * Injects OSS-specific dependencies and context.\n */\nexport const ModelNodeContextMenu = ({\n isOpen,\n onClose,\n x,\n y,\n node,\n}: LineageViewContextMenuProps<LineageGraphNode>) => {\n const {\n selectParentNodes,\n selectChildNodes,\n getNodeColumnSet,\n selectMode,\n cll,\n showColumnLevelLineage,\n } = useLineageViewContextSafe();\n const { featureToggles } = useRecceInstanceContext();\n const { isActionAvailable, lineageGraph } = useLineageGraphContext();\n const { data: flag } = useRecceServerFlag();\n const noCatalogCurrent = !lineageGraph?.catalogMetadata.current;\n\n const deps = useContextMenuDeps(node?.data?.name);\n\n return (\n <BaseModelNodeContextMenu\n x={x}\n y={y}\n node={node}\n isOpen={isOpen}\n onClose={onClose}\n deps={deps}\n viewOptions={{\n selectMode,\n cll,\n showColumnLevelLineage,\n selectParentNodes,\n selectChildNodes,\n getNodeColumnSet,\n }}\n featureToggles={{\n disableDatabaseQuery: featureToggles.disableDatabaseQuery,\n mode: featureToggles.mode ?? undefined,\n }}\n serverFlags={{\n single_env_onboarding: flag?.single_env_onboarding,\n }}\n noCatalogCurrent={noCatalogCurrent}\n isActionAvailable={isActionAvailable}\n />\n );\n};\n\n/**\n * OSS wrapper for ColumnNodeContextMenu.\n * Injects OSS-specific dependencies and context.\n */\nexport const ColumnNodeContextMenu = ({\n isOpen,\n onClose,\n x,\n y,\n node,\n}: LineageViewContextMenuProps<LineageGraphColumnNode>) => {\n const { featureToggles } = useRecceInstanceContext();\n const { isActionAvailable } = useLineageGraphContext();\n const { data: flag } = useRecceServerFlag();\n\n const deps = useContextMenuDeps(node?.data?.node?.name);\n\n return (\n <BaseColumnNodeContextMenu\n x={x}\n y={y}\n node={node}\n isOpen={isOpen}\n onClose={onClose}\n deps={deps}\n featureToggles={{\n disableDatabaseQuery: featureToggles.disableDatabaseQuery,\n mode: featureToggles.mode ?? undefined,\n }}\n serverFlags={{\n single_env_onboarding: flag?.single_env_onboarding,\n }}\n isActionAvailable={isActionAvailable}\n />\n );\n};\n\n/**\n * OSS wrapper for LineageViewContextMenu.\n * Injects OSS-specific dependencies and context.\n */\nexport const LineageViewContextMenu = ({\n isOpen,\n onClose,\n x,\n y,\n node,\n}: LineageViewContextMenuProps<LineageGraphNodes>) => {\n const {\n selectParentNodes,\n selectChildNodes,\n getNodeColumnSet,\n selectMode,\n cll,\n showColumnLevelLineage,\n } = useLineageViewContextSafe();\n const { featureToggles } = useRecceInstanceContext();\n const { isActionAvailable, lineageGraph } = useLineageGraphContext();\n const { data: flag } = useRecceServerFlag();\n const noCatalogCurrent = !lineageGraph?.catalogMetadata.current;\n\n // Get model name from either model node or column node\n const modelName =\n node?.type === \"lineageGraphNode\"\n ? (node as LineageGraphNode).data?.name\n : node?.type === \"lineageGraphColumnNode\"\n ? (node as LineageGraphColumnNode).data?.node?.name\n : undefined;\n\n const deps = useContextMenuDeps(modelName);\n\n return (\n <BaseLineageViewContextMenu\n x={x}\n y={y}\n node={node}\n isOpen={isOpen}\n onClose={onClose}\n deps={deps}\n viewOptions={{\n selectMode,\n cll,\n showColumnLevelLineage,\n selectParentNodes,\n selectChildNodes,\n getNodeColumnSet,\n }}\n featureToggles={{\n disableDatabaseQuery: featureToggles.disableDatabaseQuery,\n disableViewActionDropdown: featureToggles.disableViewActionDropdown,\n mode: featureToggles.mode ?? undefined,\n }}\n serverFlags={{\n single_env_onboarding: flag?.single_env_onboarding,\n }}\n noCatalogCurrent={noCatalogCurrent}\n isActionAvailable={isActionAvailable}\n />\n );\n};\n\n/**\n * Re-export the hook from @datarecce/ui.\n * This hook doesn't need any OSS-specific modifications.\n */\nexport const useLineageViewContextMenu = baseUseLineageViewContextMenu;\n","\"use strict\";\n\nvar DEFAULT_EDGE_NAME = \"\\x00\";\nvar GRAPH_NODE = \"\\x00\";\nvar EDGE_KEY_DELIM = \"\\x01\";\n\n// Implementation notes:\n//\n// * Node id query functions should return string ids for the nodes\n// * Edge id query functions should return an \"edgeObj\", edge object, that is\n// composed of enough information to uniquely identify an edge: {v, w, name}.\n// * Internally we use an \"edgeId\", a stringified form of the edgeObj, to\n// reference edges. This is because we need a performant way to look these\n// edges up and, object properties, which have string keys, are the closest\n// we're going to get to a performant hashtable in JavaScript.\n\nclass Graph {\n _isDirected = true;\n _isMultigraph = false;\n _isCompound = false;\n\n // Label for the graph itself\n _label;\n\n // Defaults to be set when creating a new node\n _defaultNodeLabelFn = () => undefined;\n\n // Defaults to be set when creating a new edge\n _defaultEdgeLabelFn = () => undefined;\n\n // v -> label\n _nodes = {};\n\n // v -> edgeObj\n _in = {};\n\n // u -> v -> Number\n _preds = {};\n\n // v -> edgeObj\n _out = {};\n\n // v -> w -> Number\n _sucs = {};\n\n // e -> edgeObj\n _edgeObjs = {};\n\n // e -> label\n _edgeLabels = {};\n\n /* Number of nodes in the graph. Should only be changed by the implementation. */\n _nodeCount = 0;\n\n /* Number of edges in the graph. Should only be changed by the implementation. */\n _edgeCount = 0;\n\n _parent;\n\n _children;\n\n constructor(opts) {\n if (opts) {\n this._isDirected = Object.hasOwn(opts, \"directed\") ? opts.directed : true;\n this._isMultigraph = Object.hasOwn(opts, \"multigraph\") ? opts.multigraph : false;\n this._isCompound = Object.hasOwn(opts, \"compound\") ? opts.compound : false;\n }\n\n if (this._isCompound) {\n // v -> parent\n this._parent = {};\n\n // v -> children\n this._children = {};\n this._children[GRAPH_NODE] = {};\n }\n }\n\n /* === Graph functions ========= */\n\n /**\n * Whether graph was created with 'directed' flag set to true or not.\n */\n isDirected() {\n return this._isDirected;\n }\n\n /**\n * Whether graph was created with 'multigraph' flag set to true or not.\n */\n isMultigraph() {\n return this._isMultigraph;\n }\n\n /**\n * Whether graph was created with 'compound' flag set to true or not.\n */\n isCompound() {\n return this._isCompound;\n }\n\n /**\n * Sets the label of the graph.\n */\n setGraph(label) {\n this._label = label;\n return this;\n }\n\n /**\n * Gets the graph label.\n */\n graph() {\n return this._label;\n }\n\n\n /* === Node functions ========== */\n\n /**\n * Sets the default node label. If newDefault is a function, it will be\n * invoked ach time when setting a label for a node. Otherwise, this label\n * will be assigned as default label in case if no label was specified while\n * setting a node.\n * Complexity: O(1).\n */\n setDefaultNodeLabel(newDefault) {\n this._defaultNodeLabelFn = newDefault;\n if (typeof newDefault !== 'function') {\n this._defaultNodeLabelFn = () => newDefault;\n }\n\n return this;\n }\n\n /**\n * Gets the number of nodes in the graph.\n * Complexity: O(1).\n */\n nodeCount() {\n return this._nodeCount;\n }\n\n /**\n * Gets all nodes of the graph. Note, the in case of compound graph subnodes are\n * not included in list.\n * Complexity: O(1).\n */\n nodes() {\n return Object.keys(this._nodes);\n }\n\n /**\n * Gets list of nodes without in-edges.\n * Complexity: O(|V|).\n */\n sources() {\n var self = this;\n return this.nodes().filter(v => Object.keys(self._in[v]).length === 0);\n }\n\n /**\n * Gets list of nodes without out-edges.\n * Complexity: O(|V|).\n */\n sinks() {\n var self = this;\n return this.nodes().filter(v => Object.keys(self._out[v]).length === 0);\n }\n\n /**\n * Invokes setNode method for each node in names list.\n * Complexity: O(|names|).\n */\n setNodes(vs, value) {\n var args = arguments;\n var self = this;\n vs.forEach(function(v) {\n if (args.length > 1) {\n self.setNode(v, value);\n } else {\n self.setNode(v);\n }\n });\n return this;\n }\n\n /**\n * Creates or updates the value for the node v in the graph. If label is supplied\n * it is set as the value for the node. If label is not supplied and the node was\n * created by this call then the default node label will be assigned.\n * Complexity: O(1).\n */\n setNode(v, value) {\n if (Object.hasOwn(this._nodes, v)) {\n if (arguments.length > 1) {\n this._nodes[v] = value;\n }\n return this;\n }\n\n this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);\n if (this._isCompound) {\n this._parent[v] = GRAPH_NODE;\n this._children[v] = {};\n this._children[GRAPH_NODE][v] = true;\n }\n this._in[v] = {};\n this._preds[v] = {};\n this._out[v] = {};\n this._sucs[v] = {};\n ++this._nodeCount;\n return this;\n }\n\n /**\n * Gets the label of node with specified name.\n * Complexity: O(|V|).\n */\n node(v) {\n return this._nodes[v];\n }\n\n /**\n * Detects whether graph has a node with specified name or not.\n */\n hasNode(v) {\n return Object.hasOwn(this._nodes, v);\n }\n\n /**\n * Remove the node with the name from the graph or do nothing if the node is not in\n * the graph. If the node was removed this function also removes any incident\n * edges.\n * Complexity: O(1).\n */\n removeNode(v) {\n var self = this;\n if (Object.hasOwn(this._nodes, v)) {\n var removeEdge = e => self.removeEdge(self._edgeObjs[e]);\n delete this._nodes[v];\n if (this._isCompound) {\n this._removeFromParentsChildList(v);\n delete this._parent[v];\n this.children(v).forEach(function(child) {\n self.setParent(child);\n });\n delete this._children[v];\n }\n Object.keys(this._in[v]).forEach(removeEdge);\n delete this._in[v];\n delete this._preds[v];\n Object.keys(this._out[v]).forEach(removeEdge);\n delete this._out[v];\n delete this._sucs[v];\n --this._nodeCount;\n }\n return this;\n }\n\n /**\n * Sets node p as a parent for node v if it is defined, or removes the\n * parent for v if p is undefined. Method throws an exception in case of\n * invoking it in context of noncompound graph.\n * Average-case complexity: O(1).\n */\n setParent(v, parent) {\n if (!this._isCompound) {\n throw new Error(\"Cannot set parent in a non-compound graph\");\n }\n\n if (parent === undefined) {\n parent = GRAPH_NODE;\n } else {\n // Coerce parent to string\n parent += \"\";\n for (var ancestor = parent; ancestor !== undefined; ancestor = this.parent(ancestor)) {\n if (ancestor === v) {\n throw new Error(\"Setting \" + parent+ \" as parent of \" + v +\n \" would create a cycle\");\n }\n }\n\n this.setNode(parent);\n }\n\n this.setNode(v);\n this._removeFromParentsChildList(v);\n this._parent[v] = parent;\n this._children[parent][v] = true;\n return this;\n }\n\n _removeFromParentsChildList(v) {\n delete this._children[this._parent[v]][v];\n }\n\n /**\n * Gets parent node for node v.\n * Complexity: O(1).\n */\n parent(v) {\n if (this._isCompound) {\n var parent = this._parent[v];\n if (parent !== GRAPH_NODE) {\n return parent;\n }\n }\n }\n\n /**\n * Gets list of direct children of node v.\n * Complexity: O(1).\n */\n children(v = GRAPH_NODE) {\n if (this._isCompound) {\n var children = this._children[v];\n if (children) {\n return Object.keys(children);\n }\n } else if (v === GRAPH_NODE) {\n return this.nodes();\n } else if (this.hasNode(v)) {\n return [];\n }\n }\n\n /**\n * Return all nodes that are predecessors of the specified node or undefined if node v is not in\n * the graph. Behavior is undefined for undirected graphs - use neighbors instead.\n * Complexity: O(|V|).\n */\n predecessors(v) {\n var predsV = this._preds[v];\n if (predsV) {\n return Object.keys(predsV);\n }\n }\n\n /**\n * Return all nodes that are successors of the specified node or undefined if node v is not in\n * the graph. Behavior is undefined for undirected graphs - use neighbors instead.\n * Complexity: O(|V|).\n */\n successors(v) {\n var sucsV = this._sucs[v];\n if (sucsV) {\n return Object.keys(sucsV);\n }\n }\n\n /**\n * Return all nodes that are predecessors or successors of the specified node or undefined if\n * node v is not in the graph.\n * Complexity: O(|V|).\n */\n neighbors(v) {\n var preds = this.predecessors(v);\n if (preds) {\n const union = new Set(preds);\n for (var succ of this.successors(v)) {\n union.add(succ);\n }\n\n return Array.from(union.values());\n }\n }\n\n isLeaf(v) {\n var neighbors;\n if (this.isDirected()) {\n neighbors = this.successors(v);\n } else {\n neighbors = this.neighbors(v);\n }\n return neighbors.length === 0;\n }\n\n /**\n * Creates new graph with nodes filtered via filter. Edges incident to rejected node\n * are also removed. In case of compound graph, if parent is rejected by filter,\n * than all its children are rejected too.\n * Average-case complexity: O(|E|+|V|).\n */\n filterNodes(filter) {\n var copy = new this.constructor({\n directed: this._isDirected,\n multigraph: this._isMultigraph,\n compound: this._isCompound\n });\n\n copy.setGraph(this.graph());\n\n var self = this;\n Object.entries(this._nodes).forEach(function([v, value]) {\n if (filter(v)) {\n copy.setNode(v, value);\n }\n });\n\n Object.values(this._edgeObjs).forEach(function(e) {\n if (copy.hasNode(e.v) && copy.hasNode(e.w)) {\n copy.setEdge(e, self.edge(e));\n }\n });\n\n var parents = {};\n function findParent(v) {\n var parent = self.parent(v);\n if (parent === undefined || copy.hasNode(parent)) {\n parents[v] = parent;\n return parent;\n } else if (parent in parents) {\n return parents[parent];\n } else {\n return findParent(parent);\n }\n }\n\n if (this._isCompound) {\n copy.nodes().forEach(v => copy.setParent(v, findParent(v)));\n }\n\n return copy;\n }\n\n /* === Edge functions ========== */\n\n /**\n * Sets the default edge label or factory function. This label will be\n * assigned as default label in case if no label was specified while setting\n * an edge or this function will be invoked each time when setting an edge\n * with no label specified and returned value * will be used as a label for edge.\n * Complexity: O(1).\n */\n setDefaultEdgeLabel(newDefault) {\n this._defaultEdgeLabelFn = newDefault;\n if (typeof newDefault !== 'function') {\n this._defaultEdgeLabelFn = () => newDefault;\n }\n\n return this;\n }\n\n /**\n * Gets the number of edges in the graph.\n * Complexity: O(1).\n */\n edgeCount() {\n return this._edgeCount;\n }\n\n /**\n * Gets edges of the graph. In case of compound graph subgraphs are not considered.\n * Complexity: O(|E|).\n */\n edges() {\n return Object.values(this._edgeObjs);\n }\n\n /**\n * Establish an edges path over the nodes in nodes list. If some edge is already\n * exists, it will update its label, otherwise it will create an edge between pair\n * of nodes with label provided or default label if no label provided.\n * Complexity: O(|nodes|).\n */\n setPath(vs, value) {\n var self = this;\n var args = arguments;\n vs.reduce(function(v, w) {\n if (args.length > 1) {\n self.setEdge(v, w, value);\n } else {\n self.setEdge(v, w);\n }\n return w;\n });\n return this;\n }\n\n /**\n * Creates or updates the label for the edge (v, w) with the optionally supplied\n * name. If label is supplied it is set as the value for the edge. If label is not\n * supplied and the edge was created by this call then the default edge label will\n * be assigned. The name parameter is only useful with multigraphs.\n */\n setEdge() {\n var v, w, name, value;\n var valueSpecified = false;\n var arg0 = arguments[0];\n\n if (typeof arg0 === \"object\" && arg0 !== null && \"v\" in arg0) {\n v = arg0.v;\n w = arg0.w;\n name = arg0.name;\n if (arguments.length === 2) {\n value = arguments[1];\n valueSpecified = true;\n }\n } else {\n v = arg0;\n w = arguments[1];\n name = arguments[3];\n if (arguments.length > 2) {\n value = arguments[2];\n valueSpecified = true;\n }\n }\n\n v = \"\" + v;\n w = \"\" + w;\n if (name !== undefined) {\n name = \"\" + name;\n }\n\n var e = edgeArgsToId(this._isDirected, v, w, name);\n if (Object.hasOwn(this._edgeLabels, e)) {\n if (valueSpecified) {\n this._edgeLabels[e] = value;\n }\n return this;\n }\n\n if (name !== undefined && !this._isMultigraph) {\n throw new Error(\"Cannot set a named edge when isMultigraph = false\");\n }\n\n // It didn't exist, so we need to create it.\n // First ensure the nodes exist.\n this.setNode(v);\n this.setNode(w);\n\n this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);\n\n var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);\n // Ensure we add undirected edges in a consistent way.\n v = edgeObj.v;\n w = edgeObj.w;\n\n Object.freeze(edgeObj);\n this._edgeObjs[e] = edgeObj;\n incrementOrInitEntry(this._preds[w], v);\n incrementOrInitEntry(this._sucs[v], w);\n this._in[w][e] = edgeObj;\n this._out[v][e] = edgeObj;\n this._edgeCount++;\n return this;\n }\n\n /**\n * Gets the label for the specified edge.\n * Complexity: O(1).\n */\n edge(v, w, name) {\n var e = (arguments.length === 1\n ? edgeObjToId(this._isDirected, arguments[0])\n : edgeArgsToId(this._isDirected, v, w, name));\n return this._edgeLabels[e];\n }\n\n /**\n * Gets the label for the specified edge and converts it to an object.\n * Complexity: O(1)\n */\n edgeAsObj() {\n const edge = this.edge(...arguments);\n if (typeof edge !== \"object\") {\n return {label: edge};\n }\n\n return edge;\n }\n\n /**\n * Detects whether the graph contains specified edge or not. No subgraphs are considered.\n * Complexity: O(1).\n */\n hasEdge(v, w, name) {\n var e = (arguments.length === 1\n ? edgeObjToId(this._isDirected, arguments[0])\n : edgeArgsToId(this._isDirected, v, w, name));\n return Object.hasOwn(this._edgeLabels, e);\n }\n\n /**\n * Removes the specified edge from the graph. No subgraphs are considered.\n * Complexity: O(1).\n */\n removeEdge(v, w, name) {\n var e = (arguments.length === 1\n ? edgeObjToId(this._isDirected, arguments[0])\n : edgeArgsToId(this._isDirected, v, w, name));\n var edge = this._edgeObjs[e];\n if (edge) {\n v = edge.v;\n w = edge.w;\n delete this._edgeLabels[e];\n delete this._edgeObjs[e];\n decrementOrRemoveEntry(this._preds[w], v);\n decrementOrRemoveEntry(this._sucs[v], w);\n delete this._in[w][e];\n delete this._out[v][e];\n this._edgeCount--;\n }\n return this;\n }\n\n /**\n * Return all edges that point to the node v. Optionally filters those edges down to just those\n * coming from node u. Behavior is undefined for undirected graphs - use nodeEdges instead.\n * Complexity: O(|E|).\n */\n inEdges(v, u) {\n var inV = this._in[v];\n if (inV) {\n var edges = Object.values(inV);\n if (!u) {\n return edges;\n }\n return edges.filter(edge => edge.v === u);\n }\n }\n\n /**\n * Return all edges that are pointed at by node v. Optionally filters those edges down to just\n * those point to w. Behavior is undefined for undirected graphs - use nodeEdges instead.\n * Complexity: O(|E|).\n */\n outEdges(v, w) {\n var outV = this._out[v];\n if (outV) {\n var edges = Object.values(outV);\n if (!w) {\n return edges;\n }\n return edges.filter(edge => edge.w === w);\n }\n }\n\n /**\n * Returns all edges to or from node v regardless of direction. Optionally filters those edges\n * down to just those between nodes v and w regardless of direction.\n * Complexity: O(|E|).\n */\n nodeEdges(v, w) {\n var inEdges = this.inEdges(v, w);\n if (inEdges) {\n return inEdges.concat(this.outEdges(v, w));\n }\n }\n}\n\nfunction incrementOrInitEntry(map, k) {\n if (map[k]) {\n map[k]++;\n } else {\n map[k] = 1;\n }\n}\n\nfunction decrementOrRemoveEntry(map, k) {\n if (!--map[k]) { delete map[k]; }\n}\n\nfunction edgeArgsToId(isDirected, v_, w_, name) {\n var v = \"\" + v_;\n var w = \"\" + w_;\n if (!isDirected && v > w) {\n var tmp = v;\n v = w;\n w = tmp;\n }\n return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM +\n (name === undefined ? DEFAULT_EDGE_NAME : name);\n}\n\nfunction edgeArgsToObj(isDirected, v_, w_, name) {\n var v = \"\" + v_;\n var w = \"\" + w_;\n if (!isDirected && v > w) {\n var tmp = v;\n v = w;\n w = tmp;\n }\n var edgeObj = { v: v, w: w };\n if (name) {\n edgeObj.name = name;\n }\n return edgeObj;\n}\n\nfunction edgeObjToId(isDirected, edgeObj) {\n return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);\n}\n\nmodule.exports = Graph;\n","module.exports = '2.2.4';\n","// Includes only the \"core\" of graphlib\nmodule.exports = {\n Graph: require(\"./graph\"),\n version: require(\"./version\")\n};\n","var Graph = require(\"./graph\");\n\nmodule.exports = {\n write: write,\n read: read\n};\n\n/**\n * Creates a JSON representation of the graph that can be serialized to a string with\n * JSON.stringify. The graph can later be restored using json.read.\n */\nfunction write(g) {\n var json = {\n options: {\n directed: g.isDirected(),\n multigraph: g.isMultigraph(),\n compound: g.isCompound()\n },\n nodes: writeNodes(g),\n edges: writeEdges(g)\n };\n\n if (g.graph() !== undefined) {\n json.value = structuredClone(g.graph());\n }\n return json;\n}\n\nfunction writeNodes(g) {\n return g.nodes().map(function(v) {\n var nodeValue = g.node(v);\n var parent = g.parent(v);\n var node = { v: v };\n if (nodeValue !== undefined) {\n node.value = nodeValue;\n }\n if (parent !== undefined) {\n node.parent = parent;\n }\n return node;\n });\n}\n\nfunction writeEdges(g) {\n return g.edges().map(function(e) {\n var edgeValue = g.edge(e);\n var edge = { v: e.v, w: e.w };\n if (e.name !== undefined) {\n edge.name = e.name;\n }\n if (edgeValue !== undefined) {\n edge.value = edgeValue;\n }\n return edge;\n });\n}\n\n/**\n * Takes JSON as input and returns the graph representation.\n *\n * @example\n * var g2 = graphlib.json.read(JSON.parse(str));\n * g2.nodes();\n * // ['a', 'b']\n * g2.edges()\n * // [ { v: 'a', w: 'b' } ]\n */\nfunction read(json) {\n var g = new Graph(json.options).setGraph(json.value);\n json.nodes.forEach(function(entry) {\n g.setNode(entry.v, entry.value);\n if (entry.parent) {\n g.setParent(entry.v, entry.parent);\n }\n });\n json.edges.forEach(function(entry) {\n g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\n });\n return g;\n}\n","module.exports = components;\n\nfunction components(g) {\n var visited = {};\n var cmpts = [];\n var cmpt;\n\n function dfs(v) {\n if (Object.hasOwn(visited, v)) return;\n visited[v] = true;\n cmpt.push(v);\n g.successors(v).forEach(dfs);\n g.predecessors(v).forEach(dfs);\n }\n\n g.nodes().forEach(function(v) {\n cmpt = [];\n dfs(v);\n if (cmpt.length) {\n cmpts.push(cmpt);\n }\n });\n\n return cmpts;\n}\n","/**\n * A min-priority queue data structure. This algorithm is derived from Cormen,\n * et al., \"Introduction to Algorithms\". The basic idea of a min-priority\n * queue is that you can efficiently (in O(1) time) get the smallest key in\n * the queue. Adding and removing elements takes O(log n) time. A key can\n * have its priority decreased in O(log n) time.\n */\nclass PriorityQueue {\n _arr = [];\n _keyIndices = {};\n\n /**\n * Returns the number of elements in the queue. Takes `O(1)` time.\n */\n size() {\n return this._arr.length;\n }\n\n /**\n * Returns the keys that are in the queue. Takes `O(n)` time.\n */\n keys() {\n return this._arr.map(function(x) { return x.key; });\n }\n\n /**\n * Returns `true` if **key** is in the queue and `false` if not.\n */\n has(key) {\n return Object.hasOwn(this._keyIndices, key);\n }\n\n /**\n * Returns the priority for **key**. If **key** is not present in the queue\n * then this function returns `undefined`. Takes `O(1)` time.\n *\n * @param {Object} key\n */\n priority(key) {\n var index = this._keyIndices[key];\n if (index !== undefined) {\n return this._arr[index].priority;\n }\n }\n\n /**\n * Returns the key for the minimum element in this queue. If the queue is\n * empty this function throws an Error. Takes `O(1)` time.\n */\n min() {\n if (this.size() === 0) {\n throw new Error(\"Queue underflow\");\n }\n return this._arr[0].key;\n }\n\n /**\n * Inserts a new key into the priority queue. If the key already exists in\n * the queue this function returns `false`; otherwise it will return `true`.\n * Takes `O(n)` time.\n *\n * @param {Object} key the key to add\n * @param {Number} priority the initial priority for the key\n */\n add(key, priority) {\n var keyIndices = this._keyIndices;\n key = String(key);\n if (!Object.hasOwn(keyIndices, key)) {\n var arr = this._arr;\n var index = arr.length;\n keyIndices[key] = index;\n arr.push({key: key, priority: priority});\n this._decrease(index);\n return true;\n }\n return false;\n }\n\n /**\n * Removes and returns the smallest key in the queue. Takes `O(log n)` time.\n */\n removeMin() {\n this._swap(0, this._arr.length - 1);\n var min = this._arr.pop();\n delete this._keyIndices[min.key];\n this._heapify(0);\n return min.key;\n }\n\n /**\n * Decreases the priority for **key** to **priority**. If the new priority is\n * greater than the previous priority, this function will throw an Error.\n *\n * @param {Object} key the key for which to raise priority\n * @param {Number} priority the new priority for the key\n */\n decrease(key, priority) {\n var index = this._keyIndices[key];\n if (priority > this._arr[index].priority) {\n throw new Error(\"New priority is greater than current priority. \" +\n \"Key: \" + key + \" Old: \" + this._arr[index].priority + \" New: \" + priority);\n }\n this._arr[index].priority = priority;\n this._decrease(index);\n }\n\n _heapify(i) {\n var arr = this._arr;\n var l = 2 * i;\n var r = l + 1;\n var largest = i;\n if (l < arr.length) {\n largest = arr[l].priority < arr[largest].priority ? l : largest;\n if (r < arr.length) {\n largest = arr[r].priority < arr[largest].priority ? r : largest;\n }\n if (largest !== i) {\n this._swap(i, largest);\n this._heapify(largest);\n }\n }\n }\n\n _decrease(index) {\n var arr = this._arr;\n var priority = arr[index].priority;\n var parent;\n while (index !== 0) {\n parent = index >> 1;\n if (arr[parent].priority < priority) {\n break;\n }\n this._swap(index, parent);\n index = parent;\n }\n }\n\n _swap(i, j) {\n var arr = this._arr;\n var keyIndices = this._keyIndices;\n var origArrI = arr[i];\n var origArrJ = arr[j];\n arr[i] = origArrJ;\n arr[j] = origArrI;\n keyIndices[origArrJ.key] = i;\n keyIndices[origArrI.key] = j;\n }\n}\n\nmodule.exports = PriorityQueue;\n","var PriorityQueue = require(\"../data/priority-queue\");\n\nmodule.exports = dijkstra;\n\nvar DEFAULT_WEIGHT_FUNC = () => 1;\n\nfunction dijkstra(g, source, weightFn, edgeFn) {\n return runDijkstra(g, String(source),\n weightFn || DEFAULT_WEIGHT_FUNC,\n edgeFn || function(v) { return g.outEdges(v); });\n}\n\nfunction runDijkstra(g, source, weightFn, edgeFn) {\n var results = {};\n var pq = new PriorityQueue();\n var v, vEntry;\n\n var updateNeighbors = function(edge) {\n var w = edge.v !== v ? edge.v : edge.w;\n var wEntry = results[w];\n var weight = weightFn(edge);\n var distance = vEntry.distance + weight;\n\n if (weight < 0) {\n throw new Error(\"dijkstra does not allow negative edge weights. \" +\n \"Bad edge: \" + edge + \" Weight: \" + weight);\n }\n\n if (distance < wEntry.distance) {\n wEntry.distance = distance;\n wEntry.predecessor = v;\n pq.decrease(w, distance);\n }\n };\n\n g.nodes().forEach(function(v) {\n var distance = v === source ? 0 : Number.POSITIVE_INFINITY;\n results[v] = { distance: distance };\n pq.add(v, distance);\n });\n\n while (pq.size() > 0) {\n v = pq.removeMin();\n vEntry = results[v];\n if (vEntry.distance === Number.POSITIVE_INFINITY) {\n break;\n }\n\n edgeFn(v).forEach(updateNeighbors);\n }\n\n return results;\n}\n","var dijkstra = require(\"./dijkstra\");\n\nmodule.exports = dijkstraAll;\n\nfunction dijkstraAll(g, weightFunc, edgeFunc) {\n return g.nodes().reduce(function(acc, v) {\n acc[v] = dijkstra(g, v, weightFunc, edgeFunc);\n return acc;\n }, {});\n}\n","module.exports = tarjan;\n\nfunction tarjan(g) {\n var index = 0;\n var stack = [];\n var visited = {}; // node id -> { onStack, lowlink, index }\n var results = [];\n\n function dfs(v) {\n var entry = visited[v] = {\n onStack: true,\n lowlink: index,\n index: index++\n };\n stack.push(v);\n\n g.successors(v).forEach(function(w) {\n if (!Object.hasOwn(visited, w)) {\n dfs(w);\n entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);\n } else if (visited[w].onStack) {\n entry.lowlink = Math.min(entry.lowlink, visited[w].index);\n }\n });\n\n if (entry.lowlink === entry.index) {\n var cmpt = [];\n var w;\n do {\n w = stack.pop();\n visited[w].onStack = false;\n cmpt.push(w);\n } while (v !== w);\n results.push(cmpt);\n }\n }\n\n g.nodes().forEach(function(v) {\n if (!Object.hasOwn(visited, v)) {\n dfs(v);\n }\n });\n\n return results;\n}\n","var tarjan = require(\"./tarjan\");\n\nmodule.exports = findCycles;\n\nfunction findCycles(g) {\n return tarjan(g).filter(function(cmpt) {\n return cmpt.length > 1 || (cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0]));\n });\n}\n","module.exports = floydWarshall;\n\nvar DEFAULT_WEIGHT_FUNC = () => 1;\n\nfunction floydWarshall(g, weightFn, edgeFn) {\n return runFloydWarshall(g,\n weightFn || DEFAULT_WEIGHT_FUNC,\n edgeFn || function(v) { return g.outEdges(v); });\n}\n\nfunction runFloydWarshall(g, weightFn, edgeFn) {\n var results = {};\n var nodes = g.nodes();\n\n nodes.forEach(function(v) {\n results[v] = {};\n results[v][v] = { distance: 0 };\n nodes.forEach(function(w) {\n if (v !== w) {\n results[v][w] = { distance: Number.POSITIVE_INFINITY };\n }\n });\n edgeFn(v).forEach(function(edge) {\n var w = edge.v === v ? edge.w : edge.v;\n var d = weightFn(edge);\n results[v][w] = { distance: d, predecessor: v };\n });\n });\n\n nodes.forEach(function(k) {\n var rowK = results[k];\n nodes.forEach(function(i) {\n var rowI = results[i];\n nodes.forEach(function(j) {\n var ik = rowI[k];\n var kj = rowK[j];\n var ij = rowI[j];\n var altDistance = ik.distance + kj.distance;\n if (altDistance < ij.distance) {\n ij.distance = altDistance;\n ij.predecessor = kj.predecessor;\n }\n });\n });\n });\n\n return results;\n}\n","function topsort(g) {\n var visited = {};\n var stack = {};\n var results = [];\n\n function visit(node) {\n if (Object.hasOwn(stack, node)) {\n throw new CycleException();\n }\n\n if (!Object.hasOwn(visited, node)) {\n stack[node] = true;\n visited[node] = true;\n g.predecessors(node).forEach(visit);\n delete stack[node];\n results.push(node);\n }\n }\n\n g.sinks().forEach(visit);\n\n if (Object.keys(visited).length !== g.nodeCount()) {\n throw new CycleException();\n }\n\n return results;\n}\n\nclass CycleException extends Error {\n constructor() {\n super(...arguments);\n }\n}\n\nmodule.exports = topsort;\ntopsort.CycleException = CycleException;\n","var topsort = require(\"./topsort\");\n\nmodule.exports = isAcyclic;\n\nfunction isAcyclic(g) {\n try {\n topsort(g);\n } catch (e) {\n if (e instanceof topsort.CycleException) {\n return false;\n }\n throw e;\n }\n return true;\n}\n","module.exports = dfs;\n\n/*\n * A helper that preforms a pre- or post-order traversal on the input graph\n * and returns the nodes in the order they were visited. If the graph is\n * undirected then this algorithm will navigate using neighbors. If the graph\n * is directed then this algorithm will navigate using successors.\n *\n * If the order is not \"post\", it will be treated as \"pre\".\n */\nfunction dfs(g, vs, order) {\n if (!Array.isArray(vs)) {\n vs = [vs];\n }\n\n var navigation = g.isDirected() ? v => g.successors(v) : v => g.neighbors(v);\n var orderFunc = order === \"post\" ? postOrderDfs : preOrderDfs;\n\n var acc = [];\n var visited = {};\n vs.forEach(v => {\n if (!g.hasNode(v)) {\n throw new Error(\"Graph does not have node: \" + v);\n }\n\n orderFunc(v, navigation, visited, acc);\n });\n\n return acc;\n}\n\nfunction postOrderDfs(v, navigation, visited, acc) {\n var stack = [[v, false]];\n while (stack.length > 0) {\n var curr = stack.pop();\n if (curr[1]) {\n acc.push(curr[0]);\n } else {\n if (!Object.hasOwn(visited, curr[0])) {\n visited[curr[0]] = true;\n stack.push([curr[0], true]);\n forEachRight(navigation(curr[0]), w => stack.push([w, false]));\n }\n }\n }\n}\n\nfunction preOrderDfs(v, navigation, visited, acc) {\n var stack = [v];\n while (stack.length > 0) {\n var curr = stack.pop();\n if (!Object.hasOwn(visited, curr)) {\n visited[curr] = true;\n acc.push(curr);\n forEachRight(navigation(curr), w => stack.push(w));\n }\n }\n}\n\nfunction forEachRight(array, iteratee) {\n var length = array.length;\n while (length--) {\n iteratee(array[length], length, array);\n }\n\n return array;\n}\n","var dfs = require(\"./dfs\");\n\nmodule.exports = postorder;\n\nfunction postorder(g, vs) {\n return dfs(g, vs, \"post\");\n}\n","var dfs = require(\"./dfs\");\n\nmodule.exports = preorder;\n\nfunction preorder(g, vs) {\n return dfs(g, vs, \"pre\");\n}\n","var Graph = require(\"../graph\");\nvar PriorityQueue = require(\"../data/priority-queue\");\n\nmodule.exports = prim;\n\nfunction prim(g, weightFunc) {\n var result = new Graph();\n var parents = {};\n var pq = new PriorityQueue();\n var v;\n\n function updateNeighbors(edge) {\n var w = edge.v === v ? edge.w : edge.v;\n var pri = pq.priority(w);\n if (pri !== undefined) {\n var edgeWeight = weightFunc(edge);\n if (edgeWeight < pri) {\n parents[w] = v;\n pq.decrease(w, edgeWeight);\n }\n }\n }\n\n if (g.nodeCount() === 0) {\n return result;\n }\n\n g.nodes().forEach(function(v) {\n pq.add(v, Number.POSITIVE_INFINITY);\n result.setNode(v);\n });\n\n // Start from an arbitrary node\n pq.decrease(g.nodes()[0], 0);\n\n var init = false;\n while (pq.size() > 0) {\n v = pq.removeMin();\n if (Object.hasOwn(parents, v)) {\n result.setEdge(v, parents[v]);\n } else if (init) {\n throw new Error(\"Input graph is not connected: \" + g);\n } else {\n init = true;\n }\n\n g.nodeEdges(v).forEach(updateNeighbors);\n }\n\n return result;\n}\n","module.exports = {\n components: require(\"./components\"),\n dijkstra: require(\"./dijkstra\"),\n dijkstraAll: require(\"./dijkstra-all\"),\n findCycles: require(\"./find-cycles\"),\n floydWarshall: require(\"./floyd-warshall\"),\n isAcyclic: require(\"./is-acyclic\"),\n postorder: require(\"./postorder\"),\n preorder: require(\"./preorder\"),\n prim: require(\"./prim\"),\n tarjan: require(\"./tarjan\"),\n topsort: require(\"./topsort\")\n};\n","/**\n * Copyright (c) 2014, Chris Pettitt\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nvar lib = require(\"./lib\");\n\nmodule.exports = {\n Graph: lib.Graph,\n json: require(\"./lib/json\"),\n alg: require(\"./lib/alg\"),\n version: lib.version\n};\n","/*\n * Simple doubly linked list implementation derived from Cormen, et al.,\n * \"Introduction to Algorithms\".\n */\n\nclass List {\n constructor() {\n let sentinel = {};\n sentinel._next = sentinel._prev = sentinel;\n this._sentinel = sentinel;\n }\n\n dequeue() {\n let sentinel = this._sentinel;\n let entry = sentinel._prev;\n if (entry !== sentinel) {\n unlink(entry);\n return entry;\n }\n }\n\n enqueue(entry) {\n let sentinel = this._sentinel;\n if (entry._prev && entry._next) {\n unlink(entry);\n }\n entry._next = sentinel._next;\n sentinel._next._prev = entry;\n sentinel._next = entry;\n entry._prev = sentinel;\n }\n\n toString() {\n let strs = [];\n let sentinel = this._sentinel;\n let curr = sentinel._prev;\n while (curr !== sentinel) {\n strs.push(JSON.stringify(curr, filterOutLinks));\n curr = curr._prev;\n }\n return \"[\" + strs.join(\", \") + \"]\";\n }\n}\n\nfunction unlink(entry) {\n entry._prev._next = entry._next;\n entry._next._prev = entry._prev;\n delete entry._next;\n delete entry._prev;\n}\n\nfunction filterOutLinks(k, v) {\n if (k !== \"_next\" && k !== \"_prev\") {\n return v;\n }\n}\n\nmodule.exports = List;\n","let Graph = require(\"@dagrejs/graphlib\").Graph;\nlet List = require(\"./data/list\");\n\n/*\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\n * arc set is a set of edges that can be removed to make a graph acyclic.\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, \"A fast and\n * effective heuristic for the feedback arc set problem.\" This implementation\n * adjusts that from the paper to allow for weighted edges.\n */\nmodule.exports = greedyFAS;\n\nlet DEFAULT_WEIGHT_FN = () => 1;\n\nfunction greedyFAS(g, weightFn) {\n if (g.nodeCount() <= 1) {\n return [];\n }\n let state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\n let results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\n\n // Expand multi-edges\n return results.flatMap(e => g.outEdges(e.v, e.w));\n}\n\nfunction doGreedyFAS(g, buckets, zeroIdx) {\n let results = [];\n let sources = buckets[buckets.length - 1];\n let sinks = buckets[0];\n\n let entry;\n while (g.nodeCount()) {\n while ((entry = sinks.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\n while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\n if (g.nodeCount()) {\n for (let i = buckets.length - 2; i > 0; --i) {\n entry = buckets[i].dequeue();\n if (entry) {\n results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\n break;\n }\n }\n }\n }\n\n return results;\n}\n\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\n let results = collectPredecessors ? [] : undefined;\n\n g.inEdges(entry.v).forEach(edge => {\n let weight = g.edge(edge);\n let uEntry = g.node(edge.v);\n\n if (collectPredecessors) {\n results.push({ v: edge.v, w: edge.w });\n }\n\n uEntry.out -= weight;\n assignBucket(buckets, zeroIdx, uEntry);\n });\n\n g.outEdges(entry.v).forEach(edge => {\n let weight = g.edge(edge);\n let w = edge.w;\n let wEntry = g.node(w);\n wEntry[\"in\"] -= weight;\n assignBucket(buckets, zeroIdx, wEntry);\n });\n\n g.removeNode(entry.v);\n\n return results;\n}\n\nfunction buildState(g, weightFn) {\n let fasGraph = new Graph();\n let maxIn = 0;\n let maxOut = 0;\n\n g.nodes().forEach(v => {\n fasGraph.setNode(v, { v: v, \"in\": 0, out: 0 });\n });\n\n // Aggregate weights on nodes, but also sum the weights across multi-edges\n // into a single edge for the fasGraph.\n g.edges().forEach(e => {\n let prevWeight = fasGraph.edge(e.v, e.w) || 0;\n let weight = weightFn(e);\n let edgeWeight = prevWeight + weight;\n fasGraph.setEdge(e.v, e.w, edgeWeight);\n maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);\n maxIn = Math.max(maxIn, fasGraph.node(e.w)[\"in\"] += weight);\n });\n\n let buckets = range(maxOut + maxIn + 3).map(() => new List());\n let zeroIdx = maxIn + 1;\n\n fasGraph.nodes().forEach(v => {\n assignBucket(buckets, zeroIdx, fasGraph.node(v));\n });\n\n return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\n}\n\nfunction assignBucket(buckets, zeroIdx, entry) {\n if (!entry.out) {\n buckets[0].enqueue(entry);\n } else if (!entry[\"in\"]) {\n buckets[buckets.length - 1].enqueue(entry);\n } else {\n buckets[entry.out - entry[\"in\"] + zeroIdx].enqueue(entry);\n }\n}\n\nfunction range(limit) {\n const range = [];\n for (let i = 0; i < limit; i++) {\n range.push(i);\n }\n\n return range;\n}\n","/* eslint \"no-console\": off */\n\n\"use strict\";\n\nlet Graph = require(\"@dagrejs/graphlib\").Graph;\n\nmodule.exports = {\n addBorderNode,\n addDummyNode,\n applyWithChunking,\n asNonCompoundGraph,\n buildLayerMatrix,\n intersectRect,\n mapValues,\n maxRank,\n normalizeRanks,\n notime,\n partition,\n pick,\n predecessorWeights,\n range,\n removeEmptyRanks,\n simplify,\n successorWeights,\n time,\n uniqueId,\n zipObject,\n};\n\n/*\n * Adds a dummy node to the graph and return v.\n */\nfunction addDummyNode(g, type, attrs, name) {\n var v = name;\n while (g.hasNode(v)) {\n v = uniqueId(name);\n }\n\n attrs.dummy = type;\n g.setNode(v, attrs);\n return v;\n}\n\n/*\n * Returns a new graph with only simple edges. Handles aggregation of data\n * associated with multi-edges.\n */\nfunction simplify(g) {\n let simplified = new Graph().setGraph(g.graph());\n g.nodes().forEach(v => simplified.setNode(v, g.node(v)));\n g.edges().forEach(e => {\n let simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 };\n let label = g.edge(e);\n simplified.setEdge(e.v, e.w, {\n weight: simpleLabel.weight + label.weight,\n minlen: Math.max(simpleLabel.minlen, label.minlen)\n });\n });\n return simplified;\n}\n\nfunction asNonCompoundGraph(g) {\n let simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\n g.nodes().forEach(v => {\n if (!g.children(v).length) {\n simplified.setNode(v, g.node(v));\n }\n });\n g.edges().forEach(e => {\n simplified.setEdge(e, g.edge(e));\n });\n return simplified;\n}\n\nfunction successorWeights(g) {\n let weightMap = g.nodes().map(v => {\n let sucs = {};\n g.outEdges(v).forEach(e => {\n sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\n });\n return sucs;\n });\n return zipObject(g.nodes(), weightMap);\n}\n\nfunction predecessorWeights(g) {\n let weightMap = g.nodes().map(v => {\n let preds = {};\n g.inEdges(v).forEach(e => {\n preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\n });\n return preds;\n });\n return zipObject(g.nodes(), weightMap);\n}\n\n/*\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\n * ({x, y, width, height}) if it were pointing at the rectangle's center.\n */\nfunction intersectRect(rect, point) {\n let x = rect.x;\n let y = rect.y;\n\n // Rectangle intersection algorithm from:\n // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\n let dx = point.x - x;\n let dy = point.y - y;\n let w = rect.width / 2;\n let h = rect.height / 2;\n\n if (!dx && !dy) {\n throw new Error(\"Not possible to find intersection inside of the rectangle\");\n }\n\n let sx, sy;\n if (Math.abs(dy) * w > Math.abs(dx) * h) {\n // Intersection is top or bottom of rect.\n if (dy < 0) {\n h = -h;\n }\n sx = h * dx / dy;\n sy = h;\n } else {\n // Intersection is left or right of rect.\n if (dx < 0) {\n w = -w;\n }\n sx = w;\n sy = w * dy / dx;\n }\n\n return { x: x + sx, y: y + sy };\n}\n\n/*\n * Given a DAG with each node assigned \"rank\" and \"order\" properties, this\n * function will produce a matrix with the ids of each node.\n */\nfunction buildLayerMatrix(g) {\n let layering = range(maxRank(g) + 1).map(() => []);\n g.nodes().forEach(v => {\n let node = g.node(v);\n let rank = node.rank;\n if (rank !== undefined) {\n layering[rank][node.order] = v;\n }\n });\n return layering;\n}\n\n/*\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\n */\nfunction normalizeRanks(g) {\n let nodeRanks = g.nodes().map(v => {\n let rank = g.node(v).rank;\n if (rank === undefined) {\n return Number.MAX_VALUE;\n }\n\n return rank;\n });\n let min = applyWithChunking(Math.min, nodeRanks);\n g.nodes().forEach(v => {\n let node = g.node(v);\n if (Object.hasOwn(node, \"rank\")) {\n node.rank -= min;\n }\n });\n}\n\nfunction removeEmptyRanks(g) {\n // Ranks may not start at 0, so we need to offset them\n let nodeRanks = g.nodes().map(v => g.node(v).rank);\n let offset = applyWithChunking(Math.min, nodeRanks);\n\n let layers = [];\n g.nodes().forEach(v => {\n let rank = g.node(v).rank - offset;\n if (!layers[rank]) {\n layers[rank] = [];\n }\n layers[rank].push(v);\n });\n\n let delta = 0;\n let nodeRankFactor = g.graph().nodeRankFactor;\n Array.from(layers).forEach((vs, i) => {\n if (vs === undefined && i % nodeRankFactor !== 0) {\n --delta;\n } else if (vs !== undefined && delta) {\n vs.forEach(v => g.node(v).rank += delta);\n }\n });\n}\n\nfunction addBorderNode(g, prefix, rank, order) {\n let node = {\n width: 0,\n height: 0\n };\n if (arguments.length >= 4) {\n node.rank = rank;\n node.order = order;\n }\n return addDummyNode(g, \"border\", node, prefix);\n}\n\nfunction splitToChunks(array, chunkSize = CHUNKING_THRESHOLD) {\n const chunks = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n const chunk = array.slice(i, i + chunkSize);\n chunks.push(chunk);\n }\n return chunks;\n}\n\nconst CHUNKING_THRESHOLD = 65535;\n\nfunction applyWithChunking(fn, argsArray) {\n if(argsArray.length > CHUNKING_THRESHOLD) {\n const chunks = splitToChunks(argsArray);\n return fn.apply(null, chunks.map(chunk => fn.apply(null, chunk)));\n } else {\n return fn.apply(null, argsArray);\n }\n}\n\nfunction maxRank(g) {\n const nodes = g.nodes();\n const nodeRanks = nodes.map(v => {\n let rank = g.node(v).rank;\n if (rank === undefined) {\n return Number.MIN_VALUE;\n }\n return rank;\n });\n\n return applyWithChunking(Math.max, nodeRanks);\n}\n\n/*\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\n * into `rhs.\n */\nfunction partition(collection, fn) {\n let result = { lhs: [], rhs: [] };\n collection.forEach(value => {\n if (fn(value)) {\n result.lhs.push(value);\n } else {\n result.rhs.push(value);\n }\n });\n return result;\n}\n\n/*\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\n * time it takes to execute the function.\n */\nfunction time(name, fn) {\n let start = Date.now();\n try {\n return fn();\n } finally {\n console.log(name + \" time: \" + (Date.now() - start) + \"ms\");\n }\n}\n\nfunction notime(name, fn) {\n return fn();\n}\n\nlet idCounter = 0;\nfunction uniqueId(prefix) {\n var id = ++idCounter;\n return prefix + (\"\" + id);\n}\n\nfunction range(start, limit, step = 1) {\n if (limit == null) {\n limit = start;\n start = 0;\n }\n\n let endCon = (i) => i < limit;\n if (step < 0) {\n endCon = (i) => limit < i;\n }\n\n const range = [];\n for (let i = start; endCon(i); i += step) {\n range.push(i);\n }\n\n return range;\n}\n\nfunction pick(source, keys) {\n const dest = {};\n for (const key of keys) {\n if (source[key] !== undefined) {\n dest[key] = source[key];\n }\n }\n\n return dest;\n}\n\nfunction mapValues(obj, funcOrProp) {\n let func = funcOrProp;\n if (typeof funcOrProp === 'string') {\n func = (val) => val[funcOrProp];\n }\n\n return Object.entries(obj).reduce((acc, [k, v]) => {\n acc[k] = func(v, k);\n return acc;\n }, {});\n}\n\nfunction zipObject(props, values) {\n return props.reduce((acc, key, i) => {\n acc[key] = values[i];\n return acc;\n }, {});\n}\n","\"use strict\";\n\nlet greedyFAS = require(\"./greedy-fas\");\nlet uniqueId = require(\"./util\").uniqueId;\n\nmodule.exports = {\n run: run,\n undo: undo\n};\n\nfunction run(g) {\n let fas = (g.graph().acyclicer === \"greedy\"\n ? greedyFAS(g, weightFn(g))\n : dfsFAS(g));\n fas.forEach(e => {\n let label = g.edge(e);\n g.removeEdge(e);\n label.forwardName = e.name;\n label.reversed = true;\n g.setEdge(e.w, e.v, label, uniqueId(\"rev\"));\n });\n\n function weightFn(g) {\n return e => {\n return g.edge(e).weight;\n };\n }\n}\n\nfunction dfsFAS(g) {\n let fas = [];\n let stack = {};\n let visited = {};\n\n function dfs(v) {\n if (Object.hasOwn(visited, v)) {\n return;\n }\n visited[v] = true;\n stack[v] = true;\n g.outEdges(v).forEach(e => {\n if (Object.hasOwn(stack, e.w)) {\n fas.push(e);\n } else {\n dfs(e.w);\n }\n });\n delete stack[v];\n }\n\n g.nodes().forEach(dfs);\n return fas;\n}\n\nfunction undo(g) {\n g.edges().forEach(e => {\n let label = g.edge(e);\n if (label.reversed) {\n g.removeEdge(e);\n\n let forwardName = label.forwardName;\n delete label.reversed;\n delete label.forwardName;\n g.setEdge(e.w, e.v, label, forwardName);\n }\n });\n}\n","\"use strict\";\n\nlet util = require(\"./util\");\n\nmodule.exports = {\n run: run,\n undo: undo\n};\n\n/*\n * Breaks any long edges in the graph into short segments that span 1 layer\n * each. This operation is undoable with the denormalize function.\n *\n * Pre-conditions:\n *\n * 1. The input graph is a DAG.\n * 2. Each node in the graph has a \"rank\" property.\n *\n * Post-condition:\n *\n * 1. All edges in the graph have a length of 1.\n * 2. Dummy nodes are added where edges have been split into segments.\n * 3. The graph is augmented with a \"dummyChains\" attribute which contains\n * the first dummy in each chain of dummy nodes produced.\n */\nfunction run(g) {\n g.graph().dummyChains = [];\n g.edges().forEach(edge => normalizeEdge(g, edge));\n}\n\nfunction normalizeEdge(g, e) {\n let v = e.v;\n let vRank = g.node(v).rank;\n let w = e.w;\n let wRank = g.node(w).rank;\n let name = e.name;\n let edgeLabel = g.edge(e);\n let labelRank = edgeLabel.labelRank;\n\n if (wRank === vRank + 1) return;\n\n g.removeEdge(e);\n\n let dummy, attrs, i;\n for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\n edgeLabel.points = [];\n attrs = {\n width: 0, height: 0,\n edgeLabel: edgeLabel, edgeObj: e,\n rank: vRank\n };\n dummy = util.addDummyNode(g, \"edge\", attrs, \"_d\");\n if (vRank === labelRank) {\n attrs.width = edgeLabel.width;\n attrs.height = edgeLabel.height;\n attrs.dummy = \"edge-label\";\n attrs.labelpos = edgeLabel.labelpos;\n }\n g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\n if (i === 0) {\n g.graph().dummyChains.push(dummy);\n }\n v = dummy;\n }\n\n g.setEdge(v, w, { weight: edgeLabel.weight }, name);\n}\n\nfunction undo(g) {\n g.graph().dummyChains.forEach(v => {\n let node = g.node(v);\n let origLabel = node.edgeLabel;\n let w;\n g.setEdge(node.edgeObj, origLabel);\n while (node.dummy) {\n w = g.successors(v)[0];\n g.removeNode(v);\n origLabel.points.push({ x: node.x, y: node.y });\n if (node.dummy === \"edge-label\") {\n origLabel.x = node.x;\n origLabel.y = node.y;\n origLabel.width = node.width;\n origLabel.height = node.height;\n }\n v = w;\n node = g.node(v);\n }\n });\n}\n","\"use strict\";\n\nconst { applyWithChunking } = require(\"../util\");\n\nmodule.exports = {\n longestPath: longestPath,\n slack: slack\n};\n\n/*\n * Initializes ranks for the input graph using the longest path algorithm. This\n * algorithm scales well and is fast in practice, it yields rather poor\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\n * ranks wide and leaving edges longer than necessary. However, due to its\n * speed, this algorithm is good for getting an initial ranking that can be fed\n * into other algorithms.\n *\n * This algorithm does not normalize layers because it will be used by other\n * algorithms in most cases. If using this algorithm directly, be sure to\n * run normalize at the end.\n *\n * Pre-conditions:\n *\n * 1. Input graph is a DAG.\n * 2. Input graph node labels can be assigned properties.\n *\n * Post-conditions:\n *\n * 1. Each node will be assign an (unnormalized) \"rank\" property.\n */\nfunction longestPath(g) {\n var visited = {};\n\n function dfs(v) {\n var label = g.node(v);\n if (Object.hasOwn(visited, v)) {\n return label.rank;\n }\n visited[v] = true;\n\n let outEdgesMinLens = g.outEdges(v).map(e => {\n if (e == null) {\n return Number.POSITIVE_INFINITY;\n }\n\n return dfs(e.w) - g.edge(e).minlen;\n });\n\n var rank = applyWithChunking(Math.min, outEdgesMinLens);\n\n if (rank === Number.POSITIVE_INFINITY) {\n rank = 0;\n }\n\n return (label.rank = rank);\n }\n\n g.sources().forEach(dfs);\n}\n\n/*\n * Returns the amount of slack for the given edge. The slack is defined as the\n * difference between the length of the edge and its minimum length.\n */\nfunction slack(g, e) {\n return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\n}\n","\"use strict\";\n\nvar Graph = require(\"@dagrejs/graphlib\").Graph;\nvar slack = require(\"./util\").slack;\n\nmodule.exports = feasibleTree;\n\n/*\n * Constructs a spanning tree with tight edges and adjusted the input node's\n * ranks to achieve this. A tight edge is one that is has a length that matches\n * its \"minlen\" attribute.\n *\n * The basic structure for this function is derived from Gansner, et al., \"A\n * Technique for Drawing Directed Graphs.\"\n *\n * Pre-conditions:\n *\n * 1. Graph must be a DAG.\n * 2. Graph must be connected.\n * 3. Graph must have at least one node.\n * 5. Graph nodes must have been previously assigned a \"rank\" property that\n * respects the \"minlen\" property of incident edges.\n * 6. Graph edges must have a \"minlen\" property.\n *\n * Post-conditions:\n *\n * - Graph nodes will have their rank adjusted to ensure that all edges are\n * tight.\n *\n * Returns a tree (undirected graph) that is constructed using only \"tight\"\n * edges.\n */\nfunction feasibleTree(g) {\n var t = new Graph({ directed: false });\n\n // Choose arbitrary node from which to start our tree\n var start = g.nodes()[0];\n var size = g.nodeCount();\n t.setNode(start, {});\n\n var edge, delta;\n while (tightTree(t, g) < size) {\n edge = findMinSlackEdge(t, g);\n delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\n shiftRanks(t, g, delta);\n }\n\n return t;\n}\n\n/*\n * Finds a maximal tree of tight edges and returns the number of nodes in the\n * tree.\n */\nfunction tightTree(t, g) {\n function dfs(v) {\n g.nodeEdges(v).forEach(e => {\n var edgeV = e.v,\n w = (v === edgeV) ? e.w : edgeV;\n if (!t.hasNode(w) && !slack(g, e)) {\n t.setNode(w, {});\n t.setEdge(v, w, {});\n dfs(w);\n }\n });\n }\n\n t.nodes().forEach(dfs);\n return t.nodeCount();\n}\n\n/*\n * Finds the edge with the smallest slack that is incident on tree and returns\n * it.\n */\nfunction findMinSlackEdge(t, g) {\n const edges = g.edges();\n\n return edges.reduce((acc, edge) => {\n let edgeSlack = Number.POSITIVE_INFINITY;\n if (t.hasNode(edge.v) !== t.hasNode(edge.w)) {\n edgeSlack = slack(g, edge);\n }\n\n if (edgeSlack < acc[0]) {\n return [edgeSlack, edge];\n }\n\n return acc;\n }, [Number.POSITIVE_INFINITY, null])[1];\n}\n\nfunction shiftRanks(t, g, delta) {\n t.nodes().forEach(v => g.node(v).rank += delta);\n}\n","\"use strict\";\n\nvar feasibleTree = require(\"./feasible-tree\");\nvar slack = require(\"./util\").slack;\nvar initRank = require(\"./util\").longestPath;\nvar preorder = require(\"@dagrejs/graphlib\").alg.preorder;\nvar postorder = require(\"@dagrejs/graphlib\").alg.postorder;\nvar simplify = require(\"../util\").simplify;\n\nmodule.exports = networkSimplex;\n\n// Expose some internals for testing purposes\nnetworkSimplex.initLowLimValues = initLowLimValues;\nnetworkSimplex.initCutValues = initCutValues;\nnetworkSimplex.calcCutValue = calcCutValue;\nnetworkSimplex.leaveEdge = leaveEdge;\nnetworkSimplex.enterEdge = enterEdge;\nnetworkSimplex.exchangeEdges = exchangeEdges;\n\n/*\n * The network simplex algorithm assigns ranks to each node in the input graph\n * and iteratively improves the ranking to reduce the length of edges.\n *\n * Preconditions:\n *\n * 1. The input graph must be a DAG.\n * 2. All nodes in the graph must have an object value.\n * 3. All edges in the graph must have \"minlen\" and \"weight\" attributes.\n *\n * Postconditions:\n *\n * 1. All nodes in the graph will have an assigned \"rank\" attribute that has\n * been optimized by the network simplex algorithm. Ranks start at 0.\n *\n *\n * A rough sketch of the algorithm is as follows:\n *\n * 1. Assign initial ranks to each node. We use the longest path algorithm,\n * which assigns ranks to the lowest position possible. In general this\n * leads to very wide bottom ranks and unnecessarily long edges.\n * 2. Construct a feasible tight tree. A tight tree is one such that all\n * edges in the tree have no slack (difference between length of edge\n * and minlen for the edge). This by itself greatly improves the assigned\n * rankings by shorting edges.\n * 3. Iteratively find edges that have negative cut values. Generally a\n * negative cut value indicates that the edge could be removed and a new\n * tree edge could be added to produce a more compact graph.\n *\n * Much of the algorithms here are derived from Gansner, et al., \"A Technique\n * for Drawing Directed Graphs.\" The structure of the file roughly follows the\n * structure of the overall algorithm.\n */\nfunction networkSimplex(g) {\n g = simplify(g);\n initRank(g);\n var t = feasibleTree(g);\n initLowLimValues(t);\n initCutValues(t, g);\n\n var e, f;\n while ((e = leaveEdge(t))) {\n f = enterEdge(t, g, e);\n exchangeEdges(t, g, e, f);\n }\n}\n\n/*\n * Initializes cut values for all edges in the tree.\n */\nfunction initCutValues(t, g) {\n var vs = postorder(t, t.nodes());\n vs = vs.slice(0, vs.length - 1);\n vs.forEach(v => assignCutValue(t, g, v));\n}\n\nfunction assignCutValue(t, g, child) {\n var childLab = t.node(child);\n var parent = childLab.parent;\n t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\n}\n\n/*\n * Given the tight tree, its graph, and a child in the graph calculate and\n * return the cut value for the edge between the child and its parent.\n */\nfunction calcCutValue(t, g, child) {\n var childLab = t.node(child);\n var parent = childLab.parent;\n // True if the child is on the tail end of the edge in the directed graph\n var childIsTail = true;\n // The graph's view of the tree edge we're inspecting\n var graphEdge = g.edge(child, parent);\n // The accumulated cut value for the edge between this node and its parent\n var cutValue = 0;\n\n if (!graphEdge) {\n childIsTail = false;\n graphEdge = g.edge(parent, child);\n }\n\n cutValue = graphEdge.weight;\n\n g.nodeEdges(child).forEach(e => {\n var isOutEdge = e.v === child,\n other = isOutEdge ? e.w : e.v;\n\n if (other !== parent) {\n var pointsToHead = isOutEdge === childIsTail,\n otherWeight = g.edge(e).weight;\n\n cutValue += pointsToHead ? otherWeight : -otherWeight;\n if (isTreeEdge(t, child, other)) {\n var otherCutValue = t.edge(child, other).cutvalue;\n cutValue += pointsToHead ? -otherCutValue : otherCutValue;\n }\n }\n });\n\n return cutValue;\n}\n\nfunction initLowLimValues(tree, root) {\n if (arguments.length < 2) {\n root = tree.nodes()[0];\n }\n dfsAssignLowLim(tree, {}, 1, root);\n}\n\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\n var low = nextLim;\n var label = tree.node(v);\n\n visited[v] = true;\n tree.neighbors(v).forEach(w => {\n if (!Object.hasOwn(visited, w)) {\n nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\n }\n });\n\n label.low = low;\n label.lim = nextLim++;\n if (parent) {\n label.parent = parent;\n } else {\n // TODO should be able to remove this when we incrementally update low lim\n delete label.parent;\n }\n\n return nextLim;\n}\n\nfunction leaveEdge(tree) {\n return tree.edges().find(e => tree.edge(e).cutvalue < 0);\n}\n\nfunction enterEdge(t, g, edge) {\n var v = edge.v;\n var w = edge.w;\n\n // For the rest of this function we assume that v is the tail and w is the\n // head, so if we don't have this edge in the graph we should flip it to\n // match the correct orientation.\n if (!g.hasEdge(v, w)) {\n v = edge.w;\n w = edge.v;\n }\n\n var vLabel = t.node(v);\n var wLabel = t.node(w);\n var tailLabel = vLabel;\n var flip = false;\n\n // If the root is in the tail of the edge then we need to flip the logic that\n // checks for the head and tail nodes in the candidates function below.\n if (vLabel.lim > wLabel.lim) {\n tailLabel = wLabel;\n flip = true;\n }\n\n var candidates = g.edges().filter(edge => {\n return flip === isDescendant(t, t.node(edge.v), tailLabel) &&\n flip !== isDescendant(t, t.node(edge.w), tailLabel);\n });\n\n return candidates.reduce((acc, edge) => {\n if (slack(g, edge) < slack(g, acc)) {\n return edge;\n }\n\n return acc;\n });\n}\n\nfunction exchangeEdges(t, g, e, f) {\n var v = e.v;\n var w = e.w;\n t.removeEdge(v, w);\n t.setEdge(f.v, f.w, {});\n initLowLimValues(t);\n initCutValues(t, g);\n updateRanks(t, g);\n}\n\nfunction updateRanks(t, g) {\n var root = t.nodes().find(v => !g.node(v).parent);\n var vs = preorder(t, root);\n vs = vs.slice(1);\n vs.forEach(v => {\n var parent = t.node(v).parent,\n edge = g.edge(v, parent),\n flipped = false;\n\n if (!edge) {\n edge = g.edge(parent, v);\n flipped = true;\n }\n\n g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\n });\n}\n\n/*\n * Returns true if the edge is in the tree.\n */\nfunction isTreeEdge(tree, u, v) {\n return tree.hasEdge(u, v);\n}\n\n/*\n * Returns true if the specified node is descendant of the root node per the\n * assigned low and lim attributes in the tree.\n */\nfunction isDescendant(tree, vLabel, rootLabel) {\n return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\n}\n","\"use strict\";\n\nvar rankUtil = require(\"./util\");\nvar longestPath = rankUtil.longestPath;\nvar feasibleTree = require(\"./feasible-tree\");\nvar networkSimplex = require(\"./network-simplex\");\n\nmodule.exports = rank;\n\n/*\n * Assigns a rank to each node in the input graph that respects the \"minlen\"\n * constraint specified on edges between nodes.\n *\n * This basic structure is derived from Gansner, et al., \"A Technique for\n * Drawing Directed Graphs.\"\n *\n * Pre-conditions:\n *\n * 1. Graph must be a connected DAG\n * 2. Graph nodes must be objects\n * 3. Graph edges must have \"weight\" and \"minlen\" attributes\n *\n * Post-conditions:\n *\n * 1. Graph nodes will have a \"rank\" attribute based on the results of the\n * algorithm. Ranks can start at any index (including negative), we'll\n * fix them up later.\n */\nfunction rank(g) {\n var ranker = g.graph().ranker;\n if (ranker instanceof Function) {\n return ranker(g);\n }\n\n switch(g.graph().ranker) {\n case \"network-simplex\": networkSimplexRanker(g); break;\n case \"tight-tree\": tightTreeRanker(g); break;\n case \"longest-path\": longestPathRanker(g); break;\n case \"none\": break;\n default: networkSimplexRanker(g);\n }\n}\n\n// A fast and simple ranker, but results are far from optimal.\nvar longestPathRanker = longestPath;\n\nfunction tightTreeRanker(g) {\n longestPath(g);\n feasibleTree(g);\n}\n\nfunction networkSimplexRanker(g) {\n networkSimplex(g);\n}\n","module.exports = parentDummyChains;\n\nfunction parentDummyChains(g) {\n let postorderNums = postorder(g);\n\n g.graph().dummyChains.forEach(v => {\n let node = g.node(v);\n let edgeObj = node.edgeObj;\n let pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w);\n let path = pathData.path;\n let lca = pathData.lca;\n let pathIdx = 0;\n let pathV = path[pathIdx];\n let ascending = true;\n\n while (v !== edgeObj.w) {\n node = g.node(v);\n\n if (ascending) {\n while ((pathV = path[pathIdx]) !== lca &&\n g.node(pathV).maxRank < node.rank) {\n pathIdx++;\n }\n\n if (pathV === lca) {\n ascending = false;\n }\n }\n\n if (!ascending) {\n while (pathIdx < path.length - 1 &&\n g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {\n pathIdx++;\n }\n pathV = path[pathIdx];\n }\n\n g.setParent(v, pathV);\n v = g.successors(v)[0];\n }\n });\n}\n\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\n// full path and the LCA.\nfunction findPath(g, postorderNums, v, w) {\n let vPath = [];\n let wPath = [];\n let low = Math.min(postorderNums[v].low, postorderNums[w].low);\n let lim = Math.max(postorderNums[v].lim, postorderNums[w].lim);\n let parent;\n let lca;\n\n // Traverse up from v to find the LCA\n parent = v;\n do {\n parent = g.parent(parent);\n vPath.push(parent);\n } while (parent &&\n (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\n lca = parent;\n\n // Traverse from w to LCA\n parent = w;\n while ((parent = g.parent(parent)) !== lca) {\n wPath.push(parent);\n }\n\n return { path: vPath.concat(wPath.reverse()), lca: lca };\n}\n\nfunction postorder(g) {\n let result = {};\n let lim = 0;\n\n function dfs(v) {\n let low = lim;\n g.children(v).forEach(dfs);\n result[v] = { low: low, lim: lim++ };\n }\n g.children().forEach(dfs);\n\n return result;\n}\n","let util = require(\"./util\");\n\nmodule.exports = {\n run,\n cleanup,\n};\n\n/*\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\n * adds appropriate edges to ensure that all cluster nodes are placed between\n * these boundaries, and ensures that the graph is connected.\n *\n * In addition we ensure, through the use of the minlen property, that nodes\n * and subgraph border nodes to not end up on the same rank.\n *\n * Preconditions:\n *\n * 1. Input graph is a DAG\n * 2. Nodes in the input graph has a minlen attribute\n *\n * Postconditions:\n *\n * 1. Input graph is connected.\n * 2. Dummy nodes are added for the tops and bottoms of subgraphs.\n * 3. The minlen attribute for nodes is adjusted to ensure nodes do not\n * get placed on the same rank as subgraph border nodes.\n *\n * The nesting graph idea comes from Sander, \"Layout of Compound Directed\n * Graphs.\"\n */\nfunction run(g) {\n let root = util.addDummyNode(g, \"root\", {}, \"_root\");\n let depths = treeDepths(g);\n let depthsArr = Object.values(depths);\n let height = util.applyWithChunking(Math.max, depthsArr) - 1; // Note: depths is an Object not an array\n let nodeSep = 2 * height + 1;\n\n g.graph().nestingRoot = root;\n\n // Multiply minlen by nodeSep to align nodes on non-border ranks.\n g.edges().forEach(e => g.edge(e).minlen *= nodeSep);\n\n // Calculate a weight that is sufficient to keep subgraphs vertically compact\n let weight = sumWeights(g) + 1;\n\n // Create border nodes and link them up\n g.children().forEach(child => dfs(g, root, nodeSep, weight, height, depths, child));\n\n // Save the multiplier for node layers for later removal of empty border\n // layers.\n g.graph().nodeRankFactor = nodeSep;\n}\n\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\n let children = g.children(v);\n if (!children.length) {\n if (v !== root) {\n g.setEdge(root, v, { weight: 0, minlen: nodeSep });\n }\n return;\n }\n\n let top = util.addBorderNode(g, \"_bt\");\n let bottom = util.addBorderNode(g, \"_bb\");\n let label = g.node(v);\n\n g.setParent(top, v);\n label.borderTop = top;\n g.setParent(bottom, v);\n label.borderBottom = bottom;\n\n children.forEach(child => {\n dfs(g, root, nodeSep, weight, height, depths, child);\n\n let childNode = g.node(child);\n let childTop = childNode.borderTop ? childNode.borderTop : child;\n let childBottom = childNode.borderBottom ? childNode.borderBottom : child;\n let thisWeight = childNode.borderTop ? weight : 2 * weight;\n let minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\n\n g.setEdge(top, childTop, {\n weight: thisWeight,\n minlen: minlen,\n nestingEdge: true\n });\n\n g.setEdge(childBottom, bottom, {\n weight: thisWeight,\n minlen: minlen,\n nestingEdge: true\n });\n });\n\n if (!g.parent(v)) {\n g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\n }\n}\n\nfunction treeDepths(g) {\n var depths = {};\n function dfs(v, depth) {\n var children = g.children(v);\n if (children && children.length) {\n children.forEach(child => dfs(child, depth + 1));\n }\n depths[v] = depth;\n }\n g.children().forEach(v => dfs(v, 1));\n return depths;\n}\n\nfunction sumWeights(g) {\n return g.edges().reduce((acc, e) => acc + g.edge(e).weight, 0);\n}\n\nfunction cleanup(g) {\n var graphLabel = g.graph();\n g.removeNode(graphLabel.nestingRoot);\n delete graphLabel.nestingRoot;\n g.edges().forEach(e => {\n var edge = g.edge(e);\n if (edge.nestingEdge) {\n g.removeEdge(e);\n }\n });\n}\n","let util = require(\"./util\");\n\nmodule.exports = addBorderSegments;\n\nfunction addBorderSegments(g) {\n function dfs(v) {\n let children = g.children(v);\n let node = g.node(v);\n if (children.length) {\n children.forEach(dfs);\n }\n\n if (Object.hasOwn(node, \"minRank\")) {\n node.borderLeft = [];\n node.borderRight = [];\n for (let rank = node.minRank, maxRank = node.maxRank + 1;\n rank < maxRank;\n ++rank) {\n addBorderNode(g, \"borderLeft\", \"_bl\", v, node, rank);\n addBorderNode(g, \"borderRight\", \"_br\", v, node, rank);\n }\n }\n }\n\n g.children().forEach(dfs);\n}\n\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\n let label = { width: 0, height: 0, rank: rank, borderType: prop };\n let prev = sgNode[prop][rank - 1];\n let curr = util.addDummyNode(g, \"border\", label, prefix);\n sgNode[prop][rank] = curr;\n g.setParent(curr, sg);\n if (prev) {\n g.setEdge(prev, curr, { weight: 1 });\n }\n}\n","\"use strict\";\n\nmodule.exports = {\n adjust: adjust,\n undo: undo\n};\n\nfunction adjust(g) {\n let rankDir = g.graph().rankdir.toLowerCase();\n if (rankDir === \"lr\" || rankDir === \"rl\") {\n swapWidthHeight(g);\n }\n}\n\nfunction undo(g) {\n let rankDir = g.graph().rankdir.toLowerCase();\n if (rankDir === \"bt\" || rankDir === \"rl\") {\n reverseY(g);\n }\n\n if (rankDir === \"lr\" || rankDir === \"rl\") {\n swapXY(g);\n swapWidthHeight(g);\n }\n}\n\nfunction swapWidthHeight(g) {\n g.nodes().forEach(v => swapWidthHeightOne(g.node(v)));\n g.edges().forEach(e => swapWidthHeightOne(g.edge(e)));\n}\n\nfunction swapWidthHeightOne(attrs) {\n let w = attrs.width;\n attrs.width = attrs.height;\n attrs.height = w;\n}\n\nfunction reverseY(g) {\n g.nodes().forEach(v => reverseYOne(g.node(v)));\n\n g.edges().forEach(e => {\n let edge = g.edge(e);\n edge.points.forEach(reverseYOne);\n if (Object.hasOwn(edge, \"y\")) {\n reverseYOne(edge);\n }\n });\n}\n\nfunction reverseYOne(attrs) {\n attrs.y = -attrs.y;\n}\n\nfunction swapXY(g) {\n g.nodes().forEach(v => swapXYOne(g.node(v)));\n\n g.edges().forEach(e => {\n let edge = g.edge(e);\n edge.points.forEach(swapXYOne);\n if (Object.hasOwn(edge, \"x\")) {\n swapXYOne(edge);\n }\n });\n}\n\nfunction swapXYOne(attrs) {\n let x = attrs.x;\n attrs.x = attrs.y;\n attrs.y = x;\n}\n","\"use strict\";\n\nlet util = require(\"../util\");\n\nmodule.exports = initOrder;\n\n/*\n * Assigns an initial order value for each node by performing a DFS search\n * starting from nodes in the first rank. Nodes are assigned an order in their\n * rank as they are first visited.\n *\n * This approach comes from Gansner, et al., \"A Technique for Drawing Directed\n * Graphs.\"\n *\n * Returns a layering matrix with an array per layer and each layer sorted by\n * the order of its nodes.\n */\nfunction initOrder(g) {\n let visited = {};\n let simpleNodes = g.nodes().filter(v => !g.children(v).length);\n let simpleNodesRanks = simpleNodes.map(v => g.node(v).rank);\n let maxRank = util.applyWithChunking(Math.max, simpleNodesRanks);\n let layers = util.range(maxRank + 1).map(() => []);\n\n function dfs(v) {\n if (visited[v]) return;\n visited[v] = true;\n let node = g.node(v);\n layers[node.rank].push(v);\n g.successors(v).forEach(dfs);\n }\n\n let orderedVs = simpleNodes.sort((a, b) => g.node(a).rank - g.node(b).rank);\n orderedVs.forEach(dfs);\n\n return layers;\n}\n","\"use strict\";\n\nlet zipObject = require(\"../util\").zipObject;\n\nmodule.exports = crossCount;\n\n/*\n * A function that takes a layering (an array of layers, each with an array of\n * ordererd nodes) and a graph and returns a weighted crossing count.\n *\n * Pre-conditions:\n *\n * 1. Input graph must be simple (not a multigraph), directed, and include\n * only simple edges.\n * 2. Edges in the input graph must have assigned weights.\n *\n * Post-conditions:\n *\n * 1. The graph and layering matrix are left unchanged.\n *\n * This algorithm is derived from Barth, et al., \"Bilayer Cross Counting.\"\n */\nfunction crossCount(g, layering) {\n let cc = 0;\n for (let i = 1; i < layering.length; ++i) {\n cc += twoLayerCrossCount(g, layering[i-1], layering[i]);\n }\n return cc;\n}\n\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\n // Sort all of the edges between the north and south layers by their position\n // in the north layer and then the south. Map these edges to the position of\n // their head in the south layer.\n let southPos = zipObject(southLayer, southLayer.map((v, i) => i));\n let southEntries = northLayer.flatMap(v => {\n return g.outEdges(v).map(e => {\n return { pos: southPos[e.w], weight: g.edge(e).weight };\n }).sort((a, b) => a.pos - b.pos);\n });\n\n // Build the accumulator tree\n let firstIndex = 1;\n while (firstIndex < southLayer.length) firstIndex <<= 1;\n let treeSize = 2 * firstIndex - 1;\n firstIndex -= 1;\n let tree = new Array(treeSize).fill(0);\n\n // Calculate the weighted crossings\n let cc = 0;\n southEntries.forEach(entry => {\n let index = entry.pos + firstIndex;\n tree[index] += entry.weight;\n let weightSum = 0;\n while (index > 0) {\n if (index % 2) {\n weightSum += tree[index + 1];\n }\n index = (index - 1) >> 1;\n tree[index] += entry.weight;\n }\n cc += entry.weight * weightSum;\n });\n\n return cc;\n}\n","module.exports = barycenter;\n\nfunction barycenter(g, movable = []) {\n return movable.map(v => {\n let inV = g.inEdges(v);\n if (!inV.length) {\n return { v: v };\n } else {\n let result = inV.reduce((acc, e) => {\n let edge = g.edge(e),\n nodeU = g.node(e.v);\n return {\n sum: acc.sum + (edge.weight * nodeU.order),\n weight: acc.weight + edge.weight\n };\n }, { sum: 0, weight: 0 });\n\n return {\n v: v,\n barycenter: result.sum / result.weight,\n weight: result.weight\n };\n }\n });\n}\n\n","\"use strict\";\n\nlet util = require(\"../util\");\n\nmodule.exports = resolveConflicts;\n\n/*\n * Given a list of entries of the form {v, barycenter, weight} and a\n * constraint graph this function will resolve any conflicts between the\n * constraint graph and the barycenters for the entries. If the barycenters for\n * an entry would violate a constraint in the constraint graph then we coalesce\n * the nodes in the conflict into a new node that respects the contraint and\n * aggregates barycenter and weight information.\n *\n * This implementation is based on the description in Forster, \"A Fast and\n * Simple Hueristic for Constrained Two-Level Crossing Reduction,\" thought it\n * differs in some specific details.\n *\n * Pre-conditions:\n *\n * 1. Each entry has the form {v, barycenter, weight}, or if the node has\n * no barycenter, then {v}.\n *\n * Returns:\n *\n * A new list of entries of the form {vs, i, barycenter, weight}. The list\n * `vs` may either be a singleton or it may be an aggregation of nodes\n * ordered such that they do not violate constraints from the constraint\n * graph. The property `i` is the lowest original index of any of the\n * elements in `vs`.\n */\nfunction resolveConflicts(entries, cg) {\n let mappedEntries = {};\n entries.forEach((entry, i) => {\n let tmp = mappedEntries[entry.v] = {\n indegree: 0,\n \"in\": [],\n out: [],\n vs: [entry.v],\n i: i\n };\n if (entry.barycenter !== undefined) {\n tmp.barycenter = entry.barycenter;\n tmp.weight = entry.weight;\n }\n });\n\n cg.edges().forEach(e => {\n let entryV = mappedEntries[e.v];\n let entryW = mappedEntries[e.w];\n if (entryV !== undefined && entryW !== undefined) {\n entryW.indegree++;\n entryV.out.push(mappedEntries[e.w]);\n }\n });\n\n let sourceSet = Object.values(mappedEntries).filter(entry => !entry.indegree);\n\n return doResolveConflicts(sourceSet);\n}\n\nfunction doResolveConflicts(sourceSet) {\n let entries = [];\n\n function handleIn(vEntry) {\n return uEntry => {\n if (uEntry.merged) {\n return;\n }\n if (uEntry.barycenter === undefined ||\n vEntry.barycenter === undefined ||\n uEntry.barycenter >= vEntry.barycenter) {\n mergeEntries(vEntry, uEntry);\n }\n };\n }\n\n function handleOut(vEntry) {\n return wEntry => {\n wEntry[\"in\"].push(vEntry);\n if (--wEntry.indegree === 0) {\n sourceSet.push(wEntry);\n }\n };\n }\n\n while (sourceSet.length) {\n let entry = sourceSet.pop();\n entries.push(entry);\n entry[\"in\"].reverse().forEach(handleIn(entry));\n entry.out.forEach(handleOut(entry));\n }\n\n return entries.filter(entry => !entry.merged).map(entry => {\n return util.pick(entry, [\"vs\", \"i\", \"barycenter\", \"weight\"]);\n });\n}\n\nfunction mergeEntries(target, source) {\n let sum = 0;\n let weight = 0;\n\n if (target.weight) {\n sum += target.barycenter * target.weight;\n weight += target.weight;\n }\n\n if (source.weight) {\n sum += source.barycenter * source.weight;\n weight += source.weight;\n }\n\n target.vs = source.vs.concat(target.vs);\n target.barycenter = sum / weight;\n target.weight = weight;\n target.i = Math.min(source.i, target.i);\n source.merged = true;\n}\n","let util = require(\"../util\");\n\nmodule.exports = sort;\n\nfunction sort(entries, biasRight) {\n let parts = util.partition(entries, entry => {\n return Object.hasOwn(entry, \"barycenter\");\n });\n let sortable = parts.lhs,\n unsortable = parts.rhs.sort((a, b) => b.i - a.i),\n vs = [],\n sum = 0,\n weight = 0,\n vsIndex = 0;\n\n sortable.sort(compareWithBias(!!biasRight));\n\n vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\n\n sortable.forEach(entry => {\n vsIndex += entry.vs.length;\n vs.push(entry.vs);\n sum += entry.barycenter * entry.weight;\n weight += entry.weight;\n vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\n });\n\n let result = { vs: vs.flat(true) };\n if (weight) {\n result.barycenter = sum / weight;\n result.weight = weight;\n }\n return result;\n}\n\nfunction consumeUnsortable(vs, unsortable, index) {\n let last;\n while (unsortable.length && (last = unsortable[unsortable.length - 1]).i <= index) {\n unsortable.pop();\n vs.push(last.vs);\n index++;\n }\n return index;\n}\n\nfunction compareWithBias(bias) {\n return (entryV, entryW) => {\n if (entryV.barycenter < entryW.barycenter) {\n return -1;\n } else if (entryV.barycenter > entryW.barycenter) {\n return 1;\n }\n\n return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\n };\n}\n","let barycenter = require(\"./barycenter\");\nlet resolveConflicts = require(\"./resolve-conflicts\");\nlet sort = require(\"./sort\");\n\nmodule.exports = sortSubgraph;\n\nfunction sortSubgraph(g, v, cg, biasRight) {\n let movable = g.children(v);\n let node = g.node(v);\n let bl = node ? node.borderLeft : undefined;\n let br = node ? node.borderRight: undefined;\n let subgraphs = {};\n\n if (bl) {\n movable = movable.filter(w => w !== bl && w !== br);\n }\n\n let barycenters = barycenter(g, movable);\n barycenters.forEach(entry => {\n if (g.children(entry.v).length) {\n let subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\n subgraphs[entry.v] = subgraphResult;\n if (Object.hasOwn(subgraphResult, \"barycenter\")) {\n mergeBarycenters(entry, subgraphResult);\n }\n }\n });\n\n let entries = resolveConflicts(barycenters, cg);\n expandSubgraphs(entries, subgraphs);\n\n let result = sort(entries, biasRight);\n\n if (bl) {\n result.vs = [bl, result.vs, br].flat(true);\n if (g.predecessors(bl).length) {\n let blPred = g.node(g.predecessors(bl)[0]),\n brPred = g.node(g.predecessors(br)[0]);\n if (!Object.hasOwn(result, \"barycenter\")) {\n result.barycenter = 0;\n result.weight = 0;\n }\n result.barycenter = (result.barycenter * result.weight +\n blPred.order + brPred.order) / (result.weight + 2);\n result.weight += 2;\n }\n }\n\n return result;\n}\n\nfunction expandSubgraphs(entries, subgraphs) {\n entries.forEach(entry => {\n entry.vs = entry.vs.flatMap(v => {\n if (subgraphs[v]) {\n return subgraphs[v].vs;\n }\n return v;\n });\n });\n}\n\nfunction mergeBarycenters(target, other) {\n if (target.barycenter !== undefined) {\n target.barycenter = (target.barycenter * target.weight +\n other.barycenter * other.weight) /\n (target.weight + other.weight);\n target.weight += other.weight;\n } else {\n target.barycenter = other.barycenter;\n target.weight = other.weight;\n }\n}\n","let Graph = require(\"@dagrejs/graphlib\").Graph;\nlet util = require(\"../util\");\n\nmodule.exports = buildLayerGraph;\n\n/*\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\n * contain all base and subgraph nodes from the request layer in their original\n * hierarchy and any edges that are incident on these nodes and are of the type\n * requested by the \"relationship\" parameter.\n *\n * Nodes from the requested rank that do not have parents are assigned a root\n * node in the output graph, which is set in the root graph attribute. This\n * makes it easy to walk the hierarchy of movable nodes during ordering.\n *\n * Pre-conditions:\n *\n * 1. Input graph is a DAG\n * 2. Base nodes in the input graph have a rank attribute\n * 3. Subgraph nodes in the input graph has minRank and maxRank attributes\n * 4. Edges have an assigned weight\n * 5. If `nodesWithRank` is not undefined, it must contains only the nodes\n * which belong to `g` and belong to `rank`.\n *\n * Post-conditions:\n *\n * 1. Output graph has all nodes in the movable rank with preserved\n * hierarchy.\n * 2. Root nodes in the movable layer are made children of the node\n * indicated by the root attribute of the graph.\n * 3. Non-movable nodes incident on movable nodes, selected by the\n * relationship parameter, are included in the graph (without hierarchy).\n * 4. Edges incident on movable nodes, selected by the relationship\n * parameter, are added to the output graph.\n * 5. The weights for copied edges are aggregated as need, since the output\n * graph is not a multi-graph.\n */\nfunction buildLayerGraph(g, rank, relationship, nodesWithRank) {\n if (!nodesWithRank) {\n nodesWithRank = g.nodes();\n }\n let root = createRootNode(g),\n result = new Graph({ compound: true })\n .setGraph({ root: root })\n .setDefaultNodeLabel((v) => g.node(v));\n\n nodesWithRank.forEach((v) => {\n let node = g.node(v),\n parent = g.parent(v);\n\n if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {\n result.setNode(v);\n result.setParent(v, parent || root);\n\n // This assumes we have only short edges!\n g[relationship](v).forEach(e => {\n let u = e.v === v ? e.w : e.v,\n edge = result.edge(u, v),\n weight = edge !== undefined ? edge.weight : 0;\n result.setEdge(u, v, { weight: g.edge(e).weight + weight });\n });\n\n if (Object.hasOwn(node, \"minRank\")) {\n result.setNode(v, {\n borderLeft: node.borderLeft[rank],\n borderRight: node.borderRight[rank]\n });\n }\n }\n });\n\n return result;\n}\n\nfunction createRootNode(g) {\n var v;\n while (g.hasNode((v = util.uniqueId(\"_root\"))));\n return v;\n}\n","module.exports = addSubgraphConstraints;\n\nfunction addSubgraphConstraints(g, cg, vs) {\n let prev = {},\n rootPrev;\n\n vs.forEach(v => {\n let child = g.parent(v),\n parent,\n prevChild;\n while (child) {\n parent = g.parent(child);\n if (parent) {\n prevChild = prev[parent];\n prev[parent] = child;\n } else {\n prevChild = rootPrev;\n rootPrev = child;\n }\n if (prevChild && prevChild !== child) {\n cg.setEdge(prevChild, child);\n return;\n }\n child = parent;\n }\n });\n\n /*\n function dfs(v) {\n var children = v ? g.children(v) : g.children();\n if (children.length) {\n var min = Number.POSITIVE_INFINITY,\n subgraphs = [];\n children.forEach(function(child) {\n var childMin = dfs(child);\n if (g.children(child).length) {\n subgraphs.push({ v: child, order: childMin });\n }\n min = Math.min(min, childMin);\n });\n _.sortBy(subgraphs, \"order\").reduce(function(prev, curr) {\n cg.setEdge(prev.v, curr.v);\n return curr;\n });\n return min;\n }\n return g.node(v).order;\n }\n dfs(undefined);\n */\n}\n","\"use strict\";\n\nlet initOrder = require(\"./init-order\");\nlet crossCount = require(\"./cross-count\");\nlet sortSubgraph = require(\"./sort-subgraph\");\nlet buildLayerGraph = require(\"./build-layer-graph\");\nlet addSubgraphConstraints = require(\"./add-subgraph-constraints\");\nlet Graph = require(\"@dagrejs/graphlib\").Graph;\nlet util = require(\"../util\");\n\nmodule.exports = order;\n\n/*\n * Applies heuristics to minimize edge crossings in the graph and sets the best\n * order solution as an order attribute on each node.\n *\n * Pre-conditions:\n *\n * 1. Graph must be DAG\n * 2. Graph nodes must be objects with a \"rank\" attribute\n * 3. Graph edges must have the \"weight\" attribute\n *\n * Post-conditions:\n *\n * 1. Graph nodes will have an \"order\" attribute based on the results of the\n * algorithm.\n */\nfunction order(g, opts) {\n if (opts && typeof opts.customOrder === 'function') {\n opts.customOrder(g, order);\n return;\n }\n\n let maxRank = util.maxRank(g),\n downLayerGraphs = buildLayerGraphs(g, util.range(1, maxRank + 1), \"inEdges\"),\n upLayerGraphs = buildLayerGraphs(g, util.range(maxRank - 1, -1, -1), \"outEdges\");\n\n let layering = initOrder(g);\n assignOrder(g, layering);\n\n if (opts && opts.disableOptimalOrderHeuristic) {\n return;\n }\n\n let bestCC = Number.POSITIVE_INFINITY,\n best;\n\n for (let i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\n sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\n\n layering = util.buildLayerMatrix(g);\n let cc = crossCount(g, layering);\n if (cc < bestCC) {\n lastBest = 0;\n best = Object.assign({}, layering);\n bestCC = cc;\n }\n }\n\n assignOrder(g, best);\n}\n\nfunction buildLayerGraphs(g, ranks, relationship) {\n // Build an index mapping from rank to the nodes with that rank.\n // This helps to avoid a quadratic search for all nodes with the same rank as\n // the current node.\n const nodesByRank = new Map();\n const addNodeToRank = (rank, node) => {\n if (!nodesByRank.has(rank)) {\n nodesByRank.set(rank, []);\n }\n nodesByRank.get(rank).push(node);\n };\n\n // Visit the nodes in their original order in the graph, and add each\n // node to the ranks(s) that it belongs to.\n for (const v of g.nodes()) {\n const node = g.node(v);\n if (typeof node.rank === \"number\") {\n addNodeToRank(node.rank, v);\n }\n // If there is a range of ranks, add it to each, but skip the `node.rank` which\n // has already had the node added.\n if (typeof node.minRank === \"number\" && typeof node.maxRank === \"number\") {\n for (let r = node.minRank; r <= node.maxRank; r++) {\n if (r !== node.rank) {\n // Don't add this node to its `node.rank` twice.\n addNodeToRank(r, v);\n }\n }\n }\n }\n\n return ranks.map(function (rank) {\n return buildLayerGraph(g, rank, relationship, nodesByRank.get(rank) || []);\n });\n}\n\nfunction sweepLayerGraphs(layerGraphs, biasRight) {\n let cg = new Graph();\n layerGraphs.forEach(function(lg) {\n let root = lg.graph().root;\n let sorted = sortSubgraph(lg, root, cg, biasRight);\n sorted.vs.forEach((v, i) => lg.node(v).order = i);\n addSubgraphConstraints(lg, cg, sorted.vs);\n });\n}\n\nfunction assignOrder(g, layering) {\n Object.values(layering).forEach(layer => layer.forEach((v, i) => g.node(v).order = i));\n}\n","\"use strict\";\n\nlet Graph = require(\"@dagrejs/graphlib\").Graph;\nlet util = require(\"../util\");\n\n/*\n * This module provides coordinate assignment based on Brandes and Köpf, \"Fast\n * and Simple Horizontal Coordinate Assignment.\"\n */\n\nmodule.exports = {\n positionX: positionX,\n findType1Conflicts: findType1Conflicts,\n findType2Conflicts: findType2Conflicts,\n addConflict: addConflict,\n hasConflict: hasConflict,\n verticalAlignment: verticalAlignment,\n horizontalCompaction: horizontalCompaction,\n alignCoordinates: alignCoordinates,\n findSmallestWidthAlignment: findSmallestWidthAlignment,\n balance: balance\n};\n\n/*\n * Marks all edges in the graph with a type-1 conflict with the \"type1Conflict\"\n * property. A type-1 conflict is one where a non-inner segment crosses an\n * inner segment. An inner segment is an edge with both incident nodes marked\n * with the \"dummy\" property.\n *\n * This algorithm scans layer by layer, starting with the second, for type-1\n * conflicts between the current layer and the previous layer. For each layer\n * it scans the nodes from left to right until it reaches one that is incident\n * on an inner segment. It then scans predecessors to determine if they have\n * edges that cross that inner segment. At the end a final scan is done for all\n * nodes on the current rank to see if they cross the last visited inner\n * segment.\n *\n * This algorithm (safely) assumes that a dummy node will only be incident on a\n * single node in the layers being scanned.\n */\nfunction findType1Conflicts(g, layering) {\n let conflicts = {};\n\n function visitLayer(prevLayer, layer) {\n let\n // last visited node in the previous layer that is incident on an inner\n // segment.\n k0 = 0,\n // Tracks the last node in this layer scanned for crossings with a type-1\n // segment.\n scanPos = 0,\n prevLayerLength = prevLayer.length,\n lastNode = layer[layer.length - 1];\n\n layer.forEach((v, i) => {\n let w = findOtherInnerSegmentNode(g, v),\n k1 = w ? g.node(w).order : prevLayerLength;\n\n if (w || v === lastNode) {\n layer.slice(scanPos, i+1).forEach(scanNode => {\n g.predecessors(scanNode).forEach(u => {\n let uLabel = g.node(u),\n uPos = uLabel.order;\n if ((uPos < k0 || k1 < uPos) &&\n !(uLabel.dummy && g.node(scanNode).dummy)) {\n addConflict(conflicts, u, scanNode);\n }\n });\n });\n scanPos = i + 1;\n k0 = k1;\n }\n });\n\n return layer;\n }\n\n layering.length && layering.reduce(visitLayer);\n\n return conflicts;\n}\n\nfunction findType2Conflicts(g, layering) {\n let conflicts = {};\n\n function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\n let v;\n util.range(southPos, southEnd).forEach(i => {\n v = south[i];\n if (g.node(v).dummy) {\n g.predecessors(v).forEach(u => {\n let uNode = g.node(u);\n if (uNode.dummy &&\n (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\n addConflict(conflicts, u, v);\n }\n });\n }\n });\n }\n\n\n function visitLayer(north, south) {\n let prevNorthPos = -1,\n nextNorthPos,\n southPos = 0;\n\n south.forEach((v, southLookahead) => {\n if (g.node(v).dummy === \"border\") {\n let predecessors = g.predecessors(v);\n if (predecessors.length) {\n nextNorthPos = g.node(predecessors[0]).order;\n scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\n southPos = southLookahead;\n prevNorthPos = nextNorthPos;\n }\n }\n scan(south, southPos, south.length, nextNorthPos, north.length);\n });\n\n return south;\n }\n\n layering.length && layering.reduce(visitLayer);\n\n return conflicts;\n}\n\nfunction findOtherInnerSegmentNode(g, v) {\n if (g.node(v).dummy) {\n return g.predecessors(v).find(u => g.node(u).dummy);\n }\n}\n\nfunction addConflict(conflicts, v, w) {\n if (v > w) {\n let tmp = v;\n v = w;\n w = tmp;\n }\n\n let conflictsV = conflicts[v];\n if (!conflictsV) {\n conflicts[v] = conflictsV = {};\n }\n conflictsV[w] = true;\n}\n\nfunction hasConflict(conflicts, v, w) {\n if (v > w) {\n let tmp = v;\n v = w;\n w = tmp;\n }\n return !!conflicts[v] && Object.hasOwn(conflicts[v], w);\n}\n\n/*\n * Try to align nodes into vertical \"blocks\" where possible. This algorithm\n * attempts to align a node with one of its median neighbors. If the edge\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\n * If a previous node has already formed a block with a node after the node\n * we're trying to form a block with, we also ignore that possibility - our\n * blocks would be split in that scenario.\n */\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\n let root = {},\n align = {},\n pos = {};\n\n // We cache the position here based on the layering because the graph and\n // layering may be out of sync. The layering matrix is manipulated to\n // generate different extreme alignments.\n layering.forEach(layer => {\n layer.forEach((v, order) => {\n root[v] = v;\n align[v] = v;\n pos[v] = order;\n });\n });\n\n layering.forEach(layer => {\n let prevIdx = -1;\n layer.forEach(v => {\n let ws = neighborFn(v);\n if (ws.length) {\n ws = ws.sort((a, b) => pos[a] - pos[b]);\n let mp = (ws.length - 1) / 2;\n for (let i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\n let w = ws[i];\n if (align[v] === v &&\n prevIdx < pos[w] &&\n !hasConflict(conflicts, v, w)) {\n align[w] = v;\n align[v] = root[v] = root[w];\n prevIdx = pos[w];\n }\n }\n }\n });\n });\n\n return { root: root, align: align };\n}\n\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\n // This portion of the algorithm differs from BK due to a number of problems.\n // Instead of their algorithm we construct a new block graph and do two\n // sweeps. The first sweep places blocks with the smallest possible\n // coordinates. The second sweep removes unused space by moving blocks to the\n // greatest coordinates without violating separation.\n let xs = {},\n blockG = buildBlockGraph(g, layering, root, reverseSep),\n borderType = reverseSep ? \"borderLeft\" : \"borderRight\";\n\n function iterate(setXsFunc, nextNodesFunc) {\n let stack = blockG.nodes();\n let elem = stack.pop();\n let visited = {};\n while (elem) {\n if (visited[elem]) {\n setXsFunc(elem);\n } else {\n visited[elem] = true;\n stack.push(elem);\n stack = stack.concat(nextNodesFunc(elem));\n }\n\n elem = stack.pop();\n }\n }\n\n // First pass, assign smallest coordinates\n function pass1(elem) {\n xs[elem] = blockG.inEdges(elem).reduce((acc, e) => {\n return Math.max(acc, xs[e.v] + blockG.edge(e));\n }, 0);\n }\n\n // Second pass, assign greatest coordinates\n function pass2(elem) {\n let min = blockG.outEdges(elem).reduce((acc, e) => {\n return Math.min(acc, xs[e.w] - blockG.edge(e));\n }, Number.POSITIVE_INFINITY);\n\n let node = g.node(elem);\n if (min !== Number.POSITIVE_INFINITY && node.borderType !== borderType) {\n xs[elem] = Math.max(xs[elem], min);\n }\n }\n\n iterate(pass1, blockG.predecessors.bind(blockG));\n iterate(pass2, blockG.successors.bind(blockG));\n\n // Assign x coordinates to all nodes\n Object.keys(align).forEach(v => xs[v] = xs[root[v]]);\n\n return xs;\n}\n\n\nfunction buildBlockGraph(g, layering, root, reverseSep) {\n let blockGraph = new Graph(),\n graphLabel = g.graph(),\n sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\n\n layering.forEach(layer => {\n let u;\n layer.forEach(v => {\n let vRoot = root[v];\n blockGraph.setNode(vRoot);\n if (u) {\n var uRoot = root[u],\n prevMax = blockGraph.edge(uRoot, vRoot);\n blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\n }\n u = v;\n });\n });\n\n return blockGraph;\n}\n\n/*\n * Returns the alignment that has the smallest width of the given alignments.\n */\nfunction findSmallestWidthAlignment(g, xss) {\n return Object.values(xss).reduce((currentMinAndXs, xs) => {\n let max = Number.NEGATIVE_INFINITY;\n let min = Number.POSITIVE_INFINITY;\n\n Object.entries(xs).forEach(([v, x]) => {\n let halfWidth = width(g, v) / 2;\n\n max = Math.max(x + halfWidth, max);\n min = Math.min(x - halfWidth, min);\n });\n\n const newMin = max - min;\n if (newMin < currentMinAndXs[0]) {\n currentMinAndXs = [newMin, xs];\n }\n return currentMinAndXs;\n }, [Number.POSITIVE_INFINITY, null])[1];\n}\n\n/*\n * Align the coordinates of each of the layout alignments such that\n * left-biased alignments have their minimum coordinate at the same point as\n * the minimum coordinate of the smallest width alignment and right-biased\n * alignments have their maximum coordinate at the same point as the maximum\n * coordinate of the smallest width alignment.\n */\nfunction alignCoordinates(xss, alignTo) {\n let alignToVals = Object.values(alignTo),\n alignToMin = util.applyWithChunking(Math.min, alignToVals),\n alignToMax = util.applyWithChunking(Math.max, alignToVals);\n\n [\"u\", \"d\"].forEach(vert => {\n [\"l\", \"r\"].forEach(horiz => {\n let alignment = vert + horiz,\n xs = xss[alignment];\n\n if (xs === alignTo) return;\n\n let xsVals = Object.values(xs);\n let delta = alignToMin - util.applyWithChunking(Math.min, xsVals);\n if (horiz !== \"l\") {\n delta = alignToMax - util.applyWithChunking(Math.max,xsVals);\n }\n\n if (delta) {\n xss[alignment] = util.mapValues(xs, x => x + delta);\n }\n });\n });\n}\n\nfunction balance(xss, align) {\n return util.mapValues(xss.ul, (num, v) => {\n if (align) {\n return xss[align.toLowerCase()][v];\n } else {\n let xs = Object.values(xss).map(xs => xs[v]).sort((a, b) => a - b);\n return (xs[1] + xs[2]) / 2;\n }\n });\n}\n\nfunction positionX(g) {\n let layering = util.buildLayerMatrix(g);\n let conflicts = Object.assign(\n findType1Conflicts(g, layering),\n findType2Conflicts(g, layering));\n\n let xss = {};\n let adjustedLayering;\n [\"u\", \"d\"].forEach(vert => {\n adjustedLayering = vert === \"u\" ? layering : Object.values(layering).reverse();\n [\"l\", \"r\"].forEach(horiz => {\n if (horiz === \"r\") {\n adjustedLayering = adjustedLayering.map(inner => {\n return Object.values(inner).reverse();\n });\n }\n\n let neighborFn = (vert === \"u\" ? g.predecessors : g.successors).bind(g);\n let align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\n let xs = horizontalCompaction(g, adjustedLayering,\n align.root, align.align, horiz === \"r\");\n if (horiz === \"r\") {\n xs = util.mapValues(xs, x => -x);\n }\n xss[vert + horiz] = xs;\n });\n });\n\n\n let smallestWidth = findSmallestWidthAlignment(g, xss);\n alignCoordinates(xss, smallestWidth);\n return balance(xss, g.graph().align);\n}\n\nfunction sep(nodeSep, edgeSep, reverseSep) {\n return (g, v, w) => {\n let vLabel = g.node(v);\n let wLabel = g.node(w);\n let sum = 0;\n let delta;\n\n sum += vLabel.width / 2;\n if (Object.hasOwn(vLabel, \"labelpos\")) {\n switch (vLabel.labelpos.toLowerCase()) {\n case \"l\": delta = -vLabel.width / 2; break;\n case \"r\": delta = vLabel.width / 2; break;\n }\n }\n if (delta) {\n sum += reverseSep ? delta : -delta;\n }\n delta = 0;\n\n sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\n sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\n\n sum += wLabel.width / 2;\n if (Object.hasOwn(wLabel, \"labelpos\")) {\n switch (wLabel.labelpos.toLowerCase()) {\n case \"l\": delta = wLabel.width / 2; break;\n case \"r\": delta = -wLabel.width / 2; break;\n }\n }\n if (delta) {\n sum += reverseSep ? delta : -delta;\n }\n delta = 0;\n\n return sum;\n };\n}\n\nfunction width(g, v) {\n return g.node(v).width;\n}\n","\"use strict\";\n\nlet util = require(\"../util\");\nlet positionX = require(\"./bk\").positionX;\n\nmodule.exports = position;\n\nfunction position(g) {\n g = util.asNonCompoundGraph(g);\n\n positionY(g);\n Object.entries(positionX(g)).forEach(([v, x]) => g.node(v).x = x);\n}\n\nfunction positionY(g) {\n let layering = util.buildLayerMatrix(g);\n let rankSep = g.graph().ranksep;\n let prevY = 0;\n layering.forEach(layer => {\n const maxHeight = layer.reduce((acc, v) => {\n const height = g.node(v).height;\n if (acc > height) {\n return acc;\n } else {\n return height;\n }\n }, 0);\n layer.forEach(v => g.node(v).y = prevY + maxHeight / 2);\n prevY += maxHeight + rankSep;\n });\n}\n\n","\"use strict\";\n\nlet acyclic = require(\"./acyclic\");\nlet normalize = require(\"./normalize\");\nlet rank = require(\"./rank\");\nlet normalizeRanks = require(\"./util\").normalizeRanks;\nlet parentDummyChains = require(\"./parent-dummy-chains\");\nlet removeEmptyRanks = require(\"./util\").removeEmptyRanks;\nlet nestingGraph = require(\"./nesting-graph\");\nlet addBorderSegments = require(\"./add-border-segments\");\nlet coordinateSystem = require(\"./coordinate-system\");\nlet order = require(\"./order\");\nlet position = require(\"./position\");\nlet util = require(\"./util\");\nlet Graph = require(\"@dagrejs/graphlib\").Graph;\n\nmodule.exports = layout;\n\nfunction layout(g, opts) {\n let time = opts && opts.debugTiming ? util.time : util.notime;\n time(\"layout\", () => {\n let layoutGraph =\n time(\" buildLayoutGraph\", () => buildLayoutGraph(g));\n time(\" runLayout\", () => runLayout(layoutGraph, time, opts));\n time(\" updateInputGraph\", () => updateInputGraph(g, layoutGraph));\n });\n}\n\nfunction runLayout(g, time, opts) {\n time(\" makeSpaceForEdgeLabels\", () => makeSpaceForEdgeLabels(g));\n time(\" removeSelfEdges\", () => removeSelfEdges(g));\n time(\" acyclic\", () => acyclic.run(g));\n time(\" nestingGraph.run\", () => nestingGraph.run(g));\n time(\" rank\", () => rank(util.asNonCompoundGraph(g)));\n time(\" injectEdgeLabelProxies\", () => injectEdgeLabelProxies(g));\n time(\" removeEmptyRanks\", () => removeEmptyRanks(g));\n time(\" nestingGraph.cleanup\", () => nestingGraph.cleanup(g));\n time(\" normalizeRanks\", () => normalizeRanks(g));\n time(\" assignRankMinMax\", () => assignRankMinMax(g));\n time(\" removeEdgeLabelProxies\", () => removeEdgeLabelProxies(g));\n time(\" normalize.run\", () => normalize.run(g));\n time(\" parentDummyChains\", () => parentDummyChains(g));\n time(\" addBorderSegments\", () => addBorderSegments(g));\n time(\" order\", () => order(g, opts));\n time(\" insertSelfEdges\", () => insertSelfEdges(g));\n time(\" adjustCoordinateSystem\", () => coordinateSystem.adjust(g));\n time(\" position\", () => position(g));\n time(\" positionSelfEdges\", () => positionSelfEdges(g));\n time(\" removeBorderNodes\", () => removeBorderNodes(g));\n time(\" normalize.undo\", () => normalize.undo(g));\n time(\" fixupEdgeLabelCoords\", () => fixupEdgeLabelCoords(g));\n time(\" undoCoordinateSystem\", () => coordinateSystem.undo(g));\n time(\" translateGraph\", () => translateGraph(g));\n time(\" assignNodeIntersects\", () => assignNodeIntersects(g));\n time(\" reversePoints\", () => reversePointsForReversedEdges(g));\n time(\" acyclic.undo\", () => acyclic.undo(g));\n}\n\n/*\n * Copies final layout information from the layout graph back to the input\n * graph. This process only copies whitelisted attributes from the layout graph\n * to the input graph, so it serves as a good place to determine what\n * attributes can influence layout.\n */\nfunction updateInputGraph(inputGraph, layoutGraph) {\n inputGraph.nodes().forEach(v => {\n let inputLabel = inputGraph.node(v);\n let layoutLabel = layoutGraph.node(v);\n\n if (inputLabel) {\n inputLabel.x = layoutLabel.x;\n inputLabel.y = layoutLabel.y;\n inputLabel.rank = layoutLabel.rank;\n\n if (layoutGraph.children(v).length) {\n inputLabel.width = layoutLabel.width;\n inputLabel.height = layoutLabel.height;\n }\n }\n });\n\n inputGraph.edges().forEach(e => {\n let inputLabel = inputGraph.edge(e);\n let layoutLabel = layoutGraph.edge(e);\n\n inputLabel.points = layoutLabel.points;\n if (Object.hasOwn(layoutLabel, \"x\")) {\n inputLabel.x = layoutLabel.x;\n inputLabel.y = layoutLabel.y;\n }\n });\n\n inputGraph.graph().width = layoutGraph.graph().width;\n inputGraph.graph().height = layoutGraph.graph().height;\n}\n\nlet graphNumAttrs = [\"nodesep\", \"edgesep\", \"ranksep\", \"marginx\", \"marginy\"];\nlet graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: \"tb\" };\nlet graphAttrs = [\"acyclicer\", \"ranker\", \"rankdir\", \"align\"];\nlet nodeNumAttrs = [\"width\", \"height\", \"rank\"];\nlet nodeDefaults = { width: 0, height: 0 };\nlet edgeNumAttrs = [\"minlen\", \"weight\", \"width\", \"height\", \"labeloffset\"];\nlet edgeDefaults = {\n minlen: 1, weight: 1, width: 0, height: 0,\n labeloffset: 10, labelpos: \"r\"\n};\nlet edgeAttrs = [\"labelpos\"];\n\n/*\n * Constructs a new graph from the input graph, which can be used for layout.\n * This process copies only whitelisted attributes from the input graph to the\n * layout graph. Thus this function serves as a good place to determine what\n * attributes can influence layout.\n */\nfunction buildLayoutGraph(inputGraph) {\n let g = new Graph({ multigraph: true, compound: true });\n let graph = canonicalize(inputGraph.graph());\n\n g.setGraph(Object.assign({},\n graphDefaults,\n selectNumberAttrs(graph, graphNumAttrs),\n util.pick(graph, graphAttrs)));\n\n inputGraph.nodes().forEach(v => {\n let node = canonicalize(inputGraph.node(v));\n const newNode = selectNumberAttrs(node, nodeNumAttrs);\n Object.keys(nodeDefaults).forEach(k => {\n if (newNode[k] === undefined) {\n newNode[k] = nodeDefaults[k];\n }\n });\n\n g.setNode(v, newNode);\n g.setParent(v, inputGraph.parent(v));\n });\n\n inputGraph.edges().forEach(e => {\n let edge = canonicalize(inputGraph.edge(e));\n g.setEdge(e, Object.assign({},\n edgeDefaults,\n selectNumberAttrs(edge, edgeNumAttrs),\n util.pick(edge, edgeAttrs)));\n });\n\n return g;\n}\n\n/*\n * This idea comes from the Gansner paper: to account for edge labels in our\n * layout we split each rank in half by doubling minlen and halving ranksep.\n * Then we can place labels at these mid-points between nodes.\n *\n * We also add some minimal padding to the width to push the label for the edge\n * away from the edge itself a bit.\n */\nfunction makeSpaceForEdgeLabels(g) {\n let graph = g.graph();\n graph.ranksep /= 2;\n g.edges().forEach(e => {\n let edge = g.edge(e);\n edge.minlen *= 2;\n if (edge.labelpos.toLowerCase() !== \"c\") {\n if (graph.rankdir === \"TB\" || graph.rankdir === \"BT\") {\n edge.width += edge.labeloffset;\n } else {\n edge.height += edge.labeloffset;\n }\n }\n });\n}\n\n/*\n * Creates temporary dummy nodes that capture the rank in which each edge's\n * label is going to, if it has one of non-zero width and height. We do this\n * so that we can safely remove empty ranks while preserving balance for the\n * label's position.\n */\nfunction injectEdgeLabelProxies(g) {\n g.edges().forEach(e => {\n let edge = g.edge(e);\n if (edge.width && edge.height) {\n let v = g.node(e.v);\n let w = g.node(e.w);\n let label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\n util.addDummyNode(g, \"edge-proxy\", label, \"_ep\");\n }\n });\n}\n\nfunction assignRankMinMax(g) {\n let maxRank = 0;\n g.nodes().forEach(v => {\n let node = g.node(v);\n if (node.borderTop) {\n node.minRank = g.node(node.borderTop).rank;\n node.maxRank = g.node(node.borderBottom).rank;\n maxRank = Math.max(maxRank, node.maxRank);\n }\n });\n g.graph().maxRank = maxRank;\n}\n\nfunction removeEdgeLabelProxies(g) {\n g.nodes().forEach(v => {\n let node = g.node(v);\n if (node.dummy === \"edge-proxy\") {\n g.edge(node.e).labelRank = node.rank;\n g.removeNode(v);\n }\n });\n}\n\nfunction translateGraph(g) {\n let minX = Number.POSITIVE_INFINITY;\n let maxX = 0;\n let minY = Number.POSITIVE_INFINITY;\n let maxY = 0;\n let graphLabel = g.graph();\n let marginX = graphLabel.marginx || 0;\n let marginY = graphLabel.marginy || 0;\n\n function getExtremes(attrs) {\n let x = attrs.x;\n let y = attrs.y;\n let w = attrs.width;\n let h = attrs.height;\n minX = Math.min(minX, x - w / 2);\n maxX = Math.max(maxX, x + w / 2);\n minY = Math.min(minY, y - h / 2);\n maxY = Math.max(maxY, y + h / 2);\n }\n\n g.nodes().forEach(v => getExtremes(g.node(v)));\n g.edges().forEach(e => {\n let edge = g.edge(e);\n if (Object.hasOwn(edge, \"x\")) {\n getExtremes(edge);\n }\n });\n\n minX -= marginX;\n minY -= marginY;\n\n g.nodes().forEach(v => {\n let node = g.node(v);\n node.x -= minX;\n node.y -= minY;\n });\n\n g.edges().forEach(e => {\n let edge = g.edge(e);\n edge.points.forEach(p => {\n p.x -= minX;\n p.y -= minY;\n });\n if (Object.hasOwn(edge, \"x\")) { edge.x -= minX; }\n if (Object.hasOwn(edge, \"y\")) { edge.y -= minY; }\n });\n\n graphLabel.width = maxX - minX + marginX;\n graphLabel.height = maxY - minY + marginY;\n}\n\nfunction assignNodeIntersects(g) {\n g.edges().forEach(e => {\n let edge = g.edge(e);\n let nodeV = g.node(e.v);\n let nodeW = g.node(e.w);\n let p1, p2;\n if (!edge.points) {\n edge.points = [];\n p1 = nodeW;\n p2 = nodeV;\n } else {\n p1 = edge.points[0];\n p2 = edge.points[edge.points.length - 1];\n }\n edge.points.unshift(util.intersectRect(nodeV, p1));\n edge.points.push(util.intersectRect(nodeW, p2));\n });\n}\n\nfunction fixupEdgeLabelCoords(g) {\n g.edges().forEach(e => {\n let edge = g.edge(e);\n if (Object.hasOwn(edge, \"x\")) {\n if (edge.labelpos === \"l\" || edge.labelpos === \"r\") {\n edge.width -= edge.labeloffset;\n }\n switch (edge.labelpos) {\n case \"l\": edge.x -= edge.width / 2 + edge.labeloffset; break;\n case \"r\": edge.x += edge.width / 2 + edge.labeloffset; break;\n }\n }\n });\n}\n\nfunction reversePointsForReversedEdges(g) {\n g.edges().forEach(e => {\n let edge = g.edge(e);\n if (edge.reversed) {\n edge.points.reverse();\n }\n });\n}\n\nfunction removeBorderNodes(g) {\n g.nodes().forEach(v => {\n if (g.children(v).length) {\n let node = g.node(v);\n let t = g.node(node.borderTop);\n let b = g.node(node.borderBottom);\n let l = g.node(node.borderLeft[node.borderLeft.length - 1]);\n let r = g.node(node.borderRight[node.borderRight.length - 1]);\n\n node.width = Math.abs(r.x - l.x);\n node.height = Math.abs(b.y - t.y);\n node.x = l.x + node.width / 2;\n node.y = t.y + node.height / 2;\n }\n });\n\n g.nodes().forEach(v => {\n if (g.node(v).dummy === \"border\") {\n g.removeNode(v);\n }\n });\n}\n\nfunction removeSelfEdges(g) {\n g.edges().forEach(e => {\n if (e.v === e.w) {\n var node = g.node(e.v);\n if (!node.selfEdges) {\n node.selfEdges = [];\n }\n node.selfEdges.push({ e: e, label: g.edge(e) });\n g.removeEdge(e);\n }\n });\n}\n\nfunction insertSelfEdges(g) {\n var layers = util.buildLayerMatrix(g);\n layers.forEach(layer => {\n var orderShift = 0;\n layer.forEach((v, i) => {\n var node = g.node(v);\n node.order = i + orderShift;\n (node.selfEdges || []).forEach(selfEdge => {\n util.addDummyNode(g, \"selfedge\", {\n width: selfEdge.label.width,\n height: selfEdge.label.height,\n rank: node.rank,\n order: i + (++orderShift),\n e: selfEdge.e,\n label: selfEdge.label\n }, \"_se\");\n });\n delete node.selfEdges;\n });\n });\n}\n\nfunction positionSelfEdges(g) {\n g.nodes().forEach(v => {\n var node = g.node(v);\n if (node.dummy === \"selfedge\") {\n var selfNode = g.node(node.e.v);\n var x = selfNode.x + selfNode.width / 2;\n var y = selfNode.y;\n var dx = node.x - x;\n var dy = selfNode.height / 2;\n g.setEdge(node.e, node.label);\n g.removeNode(v);\n node.label.points = [\n { x: x + 2 * dx / 3, y: y - dy },\n { x: x + 5 * dx / 6, y: y - dy },\n { x: x + dx , y: y },\n { x: x + 5 * dx / 6, y: y + dy },\n { x: x + 2 * dx / 3, y: y + dy }\n ];\n node.label.x = node.x;\n node.label.y = node.y;\n }\n });\n}\n\nfunction selectNumberAttrs(obj, attrs) {\n return util.mapValues(util.pick(obj, attrs), Number);\n}\n\nfunction canonicalize(attrs) {\n var newAttrs = {};\n if (attrs) {\n Object.entries(attrs).forEach(([k, v]) => {\n if (typeof k === \"string\") {\n k = k.toLowerCase();\n }\n\n newAttrs[k] = v;\n });\n }\n return newAttrs;\n}\n","let util = require(\"./util\");\nlet Graph = require(\"@dagrejs/graphlib\").Graph;\n\nmodule.exports = {\n debugOrdering: debugOrdering\n};\n\n/* istanbul ignore next */\nfunction debugOrdering(g) {\n let layerMatrix = util.buildLayerMatrix(g);\n\n let h = new Graph({ compound: true, multigraph: true }).setGraph({});\n\n g.nodes().forEach(v => {\n h.setNode(v, { label: v });\n h.setParent(v, \"layer\" + g.node(v).rank);\n });\n\n g.edges().forEach(e => h.setEdge(e.v, e.w, {}, e.name));\n\n layerMatrix.forEach((layer, i) => {\n let layerV = \"layer\" + i;\n h.setNode(layerV, { rank: \"same\" });\n layer.reduce((u, v) => {\n h.setEdge(u, v, { style: \"invis\" });\n return v;\n });\n });\n\n return h;\n}\n","module.exports = \"1.1.8\";\n","/*\nCopyright (c) 2012-2014 Chris Pettitt\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\nmodule.exports = {\n graphlib: require(\"@dagrejs/graphlib\"),\n\n layout: require(\"./lib/layout\"),\n debug: require(\"./lib/debug\"),\n util: {\n time: require(\"./lib/util\").time,\n notime: require(\"./lib/util\").notime\n },\n version: require(\"./lib/version\")\n};\n","import dagre from \"@dagrejs/dagre\";\nimport { Position } from \"@xyflow/react\";\nimport {\n COLUMN_HEIGHT,\n type LineageGraph,\n type LineageGraphColumnNode,\n type LineageGraphEdge,\n type LineageGraphNode,\n type LineageGraphNodes,\n layoutWithDagre,\n type NodeColumnSetMap,\n} from \"../..\";\nimport type { ColumnLineageData } from \"../../api\";\n\n/**\n * Convert a LineageGraph to React Flow nodes and edges with column-level lineage support\n *\n * This OSS-specific function extends the basic toReactFlow functionality with:\n * - Column-level lineage (CLL) visualization\n * - Dynamic node heights based on column count\n * - Column nodes as child nodes within parent model nodes\n *\n * @param lineageGraph - The lineage graph to convert\n * @param options - Conversion options\n * @param options.selectedNodes - Optional filter for which nodes to include\n * @param options.cll - Column-level lineage data for adding column nodes\n * @returns Tuple of [nodes, edges, nodeColumnSetMap] where nodeColumnSetMap tracks columns per node\n *\n * @example\n * ```tsx\n * const [nodes, edges, columnSetMap] = toReactFlow(lineageGraph, {\n * selectedNodes: [\"model.project.orders\"],\n * cll: columnLineageData,\n * });\n * ```\n */\nexport function toReactFlow(\n lineageGraph: LineageGraph,\n options?: {\n selectedNodes?: string[];\n cll?: ColumnLineageData;\n },\n): [LineageGraphNodes[], LineageGraphEdge[], NodeColumnSetMap] {\n const nodes: LineageGraphNodes[] = [];\n const edges: LineageGraphEdge[] = [];\n const { selectedNodes, cll } = options ?? {};\n\n const nodeColumnSetMap: NodeColumnSetMap = {};\n\n function getWeight(from?: string) {\n if (from === \"base\") {\n return 0;\n } else if (from === \"current\") {\n return 2;\n } else {\n return 1;\n }\n }\n\n function compareFn(\n a: LineageGraphNode | LineageGraphEdge,\n b: LineageGraphNode | LineageGraphEdge,\n ) {\n const weightA = getWeight(a.data?.from);\n const weightB = getWeight(b.data?.from);\n\n if (weightA < weightB) {\n return -1;\n } else if (weightA > weightB) {\n return 1;\n }\n return 0;\n }\n\n const filterSet =\n selectedNodes !== undefined ? new Set(selectedNodes) : undefined;\n const sortedNodes = Object.values(lineageGraph.nodes).sort(compareFn);\n for (const node of sortedNodes) {\n if (filterSet && !filterSet.has(node.id)) {\n continue;\n }\n\n // add column nodes\n const nodeColumnSet = new Set<string>();\n let columnIndex = 0;\n if (cll) {\n const maybeCurrent = cll.current as unknown as\n | ColumnLineageData[\"current\"]\n | undefined;\n const parentMap = maybeCurrent?.parent_map[node.id] ?? new Set<string>();\n\n for (const parentKey of parentMap) {\n const source = parentKey;\n const target = node.id;\n\n edges.push({\n id: `m2c_${source}_${target}`,\n source,\n target,\n style: {\n zIndex: 9999,\n },\n });\n }\n\n for (const columnName of Object.keys(\n node.data.data.current?.columns ?? {},\n )) {\n const columnKey = `${node.id}_${columnName}`;\n const maybeCurrent = cll.current as unknown as\n | ColumnLineageData[\"current\"]\n | undefined;\n const column = maybeCurrent?.columns[columnKey];\n const parentMap =\n maybeCurrent?.parent_map[columnKey] ?? new Set<string>();\n\n if (column == null) {\n continue;\n }\n\n nodes.push({\n id: columnKey,\n position: { x: 10, y: 70 + columnIndex * COLUMN_HEIGHT },\n parentId: node.id,\n extent: \"parent\",\n draggable: false,\n className: \"no-track-pii-safe\",\n data: {\n node: node.data,\n column: column.name,\n type: column.type,\n transformationType: column.transformation_type,\n changeStatus: column.change_status,\n },\n style: {\n zIndex: 9999,\n },\n type: \"lineageGraphColumnNode\",\n targetPosition: Position.Left,\n sourcePosition: Position.Right,\n } as LineageGraphColumnNode);\n\n for (const parentColumn of parentMap) {\n const source = parentColumn;\n const target = columnKey;\n\n edges.push({\n id: `${source}_${target}`,\n source,\n target,\n style: {\n zIndex: 9999,\n },\n });\n }\n\n columnIndex++;\n nodeColumnSet.add(column.name);\n }\n }\n\n nodeColumnSetMap[node.id] = nodeColumnSet;\n\n let height = 60;\n if (columnIndex > 0) {\n height += 20 + columnIndex * COLUMN_HEIGHT;\n }\n\n nodes.unshift({\n id: node.id,\n position: { x: 0, y: 0 },\n width: 300,\n height: height,\n className: \"no-track-pii-safe\",\n data: {\n ...node.data,\n },\n type: \"lineageGraphNode\",\n targetPosition: Position.Left,\n sourcePosition: Position.Right,\n style: {\n width: 300,\n height: height,\n },\n } as LineageGraphNode);\n }\n\n const sortedEdges = Object.values(lineageGraph.edges).sort(compareFn);\n for (const edge of sortedEdges) {\n if (\n filterSet &&\n (!filterSet.has(edge.source) || !filterSet.has(edge.target))\n ) {\n continue;\n }\n\n edges.push({\n id: edge.id,\n type: \"lineageGraphEdge\",\n source: edge.source,\n target: edge.target,\n data: {\n ...edge.data,\n },\n } as LineageGraphEdge);\n }\n\n layout(nodes, edges);\n\n return [nodes, edges, nodeColumnSetMap];\n}\n\n/**\n * Apply dagre layout to lineage graph nodes and edges\n *\n * This is a thin wrapper around layoutWithDagre from @datarecce/ui\n * that provides the dagre library instance.\n *\n * @param nodes - Array of lineage graph nodes\n * @param edges - Array of lineage graph edges\n * @param direction - Layout direction (\"LR\" for left-to-right, \"TB\" for top-to-bottom)\n */\nexport const layout = (\n nodes: LineageGraphNodes[],\n edges: LineageGraphEdge[],\n direction = \"LR\",\n): void => {\n layoutWithDagre(dagre, nodes, edges, direction);\n};\n","import MuiAlert from \"@mui/material/Alert\";\nimport Box from \"@mui/material/Box\";\nimport type {\n CellClickedEvent,\n GridApi,\n GridReadyEvent,\n RowClassParams,\n} from \"ag-grid-community\";\nimport {\n forwardRef,\n Ref,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport type { NodeData } from \"../../api\";\nimport { useLineageGraphContext, useLineageViewContext } from \"../../contexts\";\nimport { trackColumnLevelLineage } from \"../../lib/api/track\";\nimport type {\n SchemaDiffRow,\n SchemaRow,\n} from \"../../lib/dataGrid/generators/toSchemaDataGrid\";\nimport {\n type DataGridHandle,\n EmptyRowsRenderer,\n ScreenshotDataGrid,\n} from \"../../primitives\";\nimport { createDataGridFromData } from \"../ui/dataGrid\";\n\ninterface SchemaViewProps {\n base?: NodeData;\n current?: NodeData;\n enableScreenshot?: boolean;\n showMenu?: boolean;\n}\n\nfunction PrivateSingleEnvSchemaView(\n { current, showMenu = true }: { current?: NodeData; showMenu?: boolean },\n ref: Ref<DataGridHandle>,\n) {\n const lineageViewContext = useLineageViewContext();\n const [gridApi, setGridApi] = useState<GridApi<SchemaRow> | null>(null);\n const [cllRunningMap, setCllRunningMap] = useState<Map<string, boolean>>(\n new Map(),\n );\n const { columns, rows } = useMemo(() => {\n return createDataGridFromData(\n { type: \"schema_single\", columns: current?.columns },\n { node: current, cllRunningMap, showMenu },\n );\n }, [current, cllRunningMap, showMenu]);\n\n const { lineageGraph } = useLineageGraphContext();\n const noCatalogCurrent = !lineageGraph?.catalogMetadata.current;\n let catalogMissingMessage = undefined;\n if (noCatalogCurrent) {\n catalogMissingMessage =\n \"catalog.json not found. Run `recce debug` to troubleshoot.\";\n }\n\n const noSchemaCurrent = current && current.columns === undefined;\n let schemaMissingMessage = undefined;\n if (noSchemaCurrent) {\n schemaMissingMessage =\n \"catalog.json is outdated. Update catalog.json to get schema information.\";\n }\n\n const handleViewCll = async (columnName: string) => {\n trackColumnLevelLineage({ action: \"view\", source: \"schema_column\" });\n setCllRunningMap((prev) => new Map(prev).set(columnName, true));\n const modelId = current?.id;\n if (modelId) {\n await lineageViewContext?.showColumnLevelLineage({\n node_id: modelId,\n column: columnName,\n });\n }\n setCllRunningMap((prev) => new Map(prev).set(columnName, false));\n };\n\n const getRowId = useCallback(\n (params: { data: SchemaRow }) => {\n const modelId = current?.id;\n return `${modelId}-${params.data.name}`;\n },\n [current?.id],\n );\n\n const cll = lineageViewContext?.viewOptions.column_level_lineage;\n const selectedRowId = cll ? `${cll.node_id}-${cll.column}` : null;\n\n // Update row selection when cll changes\n useEffect(() => {\n if (!gridApi) return;\n gridApi.deselectAll();\n if (selectedRowId) {\n const rowNode = gridApi.getRowNode(selectedRowId);\n if (rowNode) {\n rowNode.setSelected(true);\n }\n }\n }, [gridApi, selectedRowId]);\n\n const handleGridReady = useCallback((event: GridReadyEvent<SchemaRow>) => {\n setGridApi(event.api);\n }, []);\n\n const getRowClass = (_params: RowClassParams<SchemaRow>) => {\n if (lineageViewContext !== undefined) {\n return \"row-normal row-selectable\";\n }\n return \"row-normal\";\n };\n\n const handleCellClicked = async (event: CellClickedEvent<SchemaRow>) => {\n // Skip if clicking on the menu button\n const target = event.event?.target as HTMLElement | undefined;\n if (target?.closest(\".row-context-menu\")) {\n return;\n }\n const row = event.data;\n if (row) {\n await handleViewCll(row.name);\n }\n };\n\n return (\n <Box sx={{ display: \"flex\", flexDirection: \"column\", height: \"100%\" }}>\n {catalogMissingMessage ? (\n <MuiAlert severity=\"warning\" sx={{ fontSize: \"12px\", p: 1 }}>\n {catalogMissingMessage}\n </MuiAlert>\n ) : schemaMissingMessage ? (\n <MuiAlert severity=\"warning\" sx={{ fontSize: \"12px\", p: 1 }}>\n {schemaMissingMessage}\n </MuiAlert>\n ) : (\n <></>\n )}\n\n {rows.length > 0 && (\n <ScreenshotDataGrid\n style={{\n blockSize: \"auto\",\n maxHeight: \"100%\",\n overflow: \"auto\",\n fontSize: \"10pt\",\n borderWidth: 1,\n }}\n columns={columns}\n rows={rows}\n renderers={{ noRowsFallback: <EmptyRowsRenderer /> }}\n ref={ref}\n getRowId={getRowId}\n getRowClass={getRowClass}\n onCellClicked={handleCellClicked}\n onGridReady={handleGridReady}\n rowSelection={{ mode: \"singleRow\" }}\n containerClassName=\"no-track-pii-safe\"\n rowClassName=\"no-track-pii-safe\"\n />\n )}\n </Box>\n );\n}\n\nexport function PrivateSchemaView(\n { base, current, showMenu = true }: SchemaViewProps,\n ref: Ref<DataGridHandle>,\n) {\n const lineageViewContext = useLineageViewContext();\n const [gridApi, setGridApi] = useState<GridApi<SchemaDiffRow> | null>(null);\n const [cllRunningMap, setCllRunningMap] = useState<Map<string, boolean>>(\n new Map(),\n );\n const { columns, rows } = useMemo(() => {\n const resourceType = current?.resource_type ?? base?.resource_type;\n const node =\n resourceType &&\n [\"model\", \"seed\", \"snapshot\", \"source\"].includes(resourceType)\n ? (current ?? base)\n : undefined;\n\n return createDataGridFromData(\n { type: \"schema_diff\", base: base?.columns, current: current?.columns },\n { node, cllRunningMap, showMenu },\n );\n }, [base, current, cllRunningMap, showMenu]);\n\n const { lineageGraph } = useLineageGraphContext();\n const noCatalogBase = !lineageGraph?.catalogMetadata.base;\n const noCatalogCurrent = !lineageGraph?.catalogMetadata.current;\n let catalogMissingMessage = undefined;\n if (noCatalogBase && noCatalogCurrent) {\n catalogMissingMessage =\n \"catalog.json not found on both environments. Run `recce debug` to troubleshoot.\";\n } else if (noCatalogBase) {\n catalogMissingMessage =\n \"catalog.json not found on base environment. Run `recce debug` to troubleshoot.\";\n } else if (noCatalogCurrent) {\n catalogMissingMessage =\n \"catalog.json not found on current environment. Run `recce debug` to troubleshoot.\";\n }\n\n const noSchemaBase = base && base.columns === undefined;\n const noSchemaCurrent = current && current.columns === undefined;\n let schemaMissingMessage = undefined;\n if (noSchemaBase && noSchemaCurrent) {\n schemaMissingMessage =\n \"catalog.json is outdated on both environments. Update catalog.json to get schema information.\";\n } else if (noSchemaCurrent) {\n schemaMissingMessage =\n \"catalog.json is outdated on current environment. Update catalog.json to get schema information.\";\n } else if (noSchemaBase) {\n schemaMissingMessage =\n \"catalog.json is outdated on base environment. Update catalog.json to get schema information.\";\n }\n\n const handleViewCll = async (columnName: string) => {\n trackColumnLevelLineage({ action: \"view\", source: \"schema_column\" });\n setCllRunningMap((prev) => new Map(prev).set(columnName, true));\n const modelId = current?.id ?? base?.id;\n if (modelId) {\n await lineageViewContext?.showColumnLevelLineage({\n node_id: modelId,\n column: columnName,\n });\n }\n setCllRunningMap((prev) => new Map(prev).set(columnName, false));\n };\n\n const getRowId = useCallback(\n (params: { data: SchemaDiffRow }) => {\n const modelId = current?.id ?? base?.id;\n return `${modelId}-${params.data.name}`;\n },\n [current?.id, base?.id],\n );\n\n const cll = lineageViewContext?.viewOptions.column_level_lineage;\n const selectedRowId = cll ? `${cll.node_id}-${cll.column}` : null;\n\n // Update row selection when cll changes\n useEffect(() => {\n if (!gridApi) return;\n gridApi.deselectAll();\n if (selectedRowId) {\n const rowNode = gridApi.getRowNode(selectedRowId);\n if (rowNode) {\n rowNode.setSelected(true);\n }\n }\n }, [gridApi, selectedRowId]);\n\n const handleGridReady = useCallback(\n (event: GridReadyEvent<SchemaDiffRow>) => {\n setGridApi(event.api);\n },\n [],\n );\n\n const getRowClass = (params: RowClassParams<SchemaDiffRow>) => {\n const row = params.data;\n if (!row) return \"row-normal\";\n\n let className;\n if (row.baseIndex === undefined) {\n className = \"row-added\";\n } else if (row.currentIndex === undefined) {\n return \"row-removed\"; // removed column isn't selectable\n } else {\n className = \"row-normal\";\n }\n if (lineageViewContext !== undefined) {\n className += \" row-selectable\";\n }\n return className;\n };\n\n const handleCellClicked = async (event: CellClickedEvent<SchemaDiffRow>) => {\n // Skip if clicking on the menu button\n const target = event.event?.target as HTMLElement | undefined;\n if (target?.closest(\".row-context-menu\")) {\n return;\n }\n const row = event.data;\n if (!row) return;\n // Removed columns aren't clickable\n if (row.baseIndex !== undefined && row.currentIndex === undefined) {\n return;\n }\n await handleViewCll(row.name);\n };\n\n return (\n <Box sx={{ display: \"flex\", flexDirection: \"column\", height: \"100%\" }}>\n {catalogMissingMessage ? (\n <MuiAlert severity=\"warning\" sx={{ fontSize: \"12px\", p: 1 }}>\n {catalogMissingMessage}\n </MuiAlert>\n ) : schemaMissingMessage ? (\n <MuiAlert severity=\"warning\" sx={{ fontSize: \"12px\", p: 1 }}>\n {schemaMissingMessage}\n </MuiAlert>\n ) : (\n <></>\n )}\n\n {rows.length > 0 && (\n <ScreenshotDataGrid\n style={{\n blockSize: \"auto\",\n maxHeight: \"100%\",\n overflow: \"auto\",\n fontSize: \"0.8rem\",\n borderWidth: 1,\n }}\n columns={columns}\n rows={rows}\n rowHeight={35}\n renderers={{ noRowsFallback: <EmptyRowsRenderer /> }}\n className=\"rdg-light no-track-pii-safe\"\n ref={ref}\n getRowId={getRowId}\n getRowClass={getRowClass}\n onCellClicked={handleCellClicked}\n onGridReady={handleGridReady}\n rowSelection={{ mode: \"singleRow\" }}\n containerClassName=\"no-track-pii-safe\"\n rowClassName=\"no-track-pii-safe\"\n />\n )}\n </Box>\n );\n}\n\nexport const SchemaView = forwardRef(PrivateSchemaView);\nexport const SingleEnvSchemaView = forwardRef(PrivateSingleEnvSchemaView);\n","\"use client\";\n\nimport Box from \"@mui/material/Box\";\nimport MuiDialog from \"@mui/material/Dialog\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport IconButton from \"@mui/material/IconButton\";\nimport type { ComponentType } from \"react\";\nimport { useState } from \"react\";\nimport { FaExpandArrowsAlt } from \"react-icons/fa\";\nimport { IoClose } from \"react-icons/io5\";\n\n/**\n * Props for a code editor component.\n * Used for dependency injection to avoid coupling to a specific editor implementation.\n */\nexport interface CodeEditorProps {\n value: string;\n language?: string;\n readOnly?: boolean;\n lineNumbers?: boolean;\n wordWrap?: boolean;\n theme?: \"light\" | \"dark\";\n fontSize?: number;\n height?: string;\n className?: string;\n}\n\n/**\n * Props for a diff editor component.\n * Used for dependency injection to avoid coupling to a specific editor implementation.\n */\nexport interface DiffEditorProps {\n original: string;\n modified: string;\n language?: string;\n readOnly?: boolean;\n lineNumbers?: boolean;\n sideBySide?: boolean;\n theme?: \"light\" | \"dark\";\n height?: string;\n className?: string;\n}\n\n/**\n * Node data structure representing model information for SQL display.\n * Fields are optional to accommodate various node data structures from the API.\n */\nexport interface NodeSqlViewNodeData {\n resourceType?: string;\n data: {\n base?: { raw_code?: string; name?: string };\n current?: { raw_code?: string; name?: string };\n };\n name?: string;\n}\n\n/**\n * Props for the NodeSqlView component.\n *\n * This component uses dependency injection for editor components to avoid\n * coupling to specific editor implementations like CodeMirror.\n *\n * Editor component props use `ComponentType<any>` to allow implementations\n * with more specific prop types (e.g., language as a union type vs string).\n * The component internally passes the correct props matching the interfaces above.\n */\nexport interface NodeSqlViewProps {\n /**\n * Node containing model data with SQL code.\n */\n node: {\n data: NodeSqlViewNodeData;\n };\n /**\n * Whether the environment is single-env mode (no diff view).\n */\n isSingleEnv: boolean;\n /**\n * Code editor component for single-env mode.\n * Should accept props matching CodeEditorProps interface.\n */\n // biome-ignore lint/suspicious/noExplicitAny: DI pattern requires flexible component types\n CodeEditor: ComponentType<any>;\n /**\n * Diff editor component for comparing base vs current.\n * Should accept props matching DiffEditorProps interface.\n */\n // biome-ignore lint/suspicious/noExplicitAny: DI pattern requires flexible component types\n DiffEditor: ComponentType<any>;\n /**\n * Whether dark mode is enabled.\n */\n isDark?: boolean;\n}\n\n/**\n * Displays SQL code for a lineage node with an expandable dialog.\n *\n * In single-env mode, shows just the code. Otherwise, shows a diff view\n * comparing base and current versions.\n *\n * Editor components are injected as props to allow the consuming application\n * to provide its own editor implementations (e.g., CodeMirror, Monaco).\n */\nexport const NodeSqlView = ({\n node,\n isSingleEnv,\n CodeEditor,\n DiffEditor,\n isDark = false,\n}: NodeSqlViewProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n\n if (\n node.data.resourceType !== \"model\" &&\n node.data.resourceType !== \"snapshot\"\n ) {\n return \"Not available\";\n }\n\n const original = node.data.data.base?.raw_code;\n const modified = node.data.data.current?.raw_code;\n const modelName =\n node.data.data.base?.name ?? node.data.data.current?.name ?? \"\";\n\n return (\n <Box\n className=\"no-track-pii-safe\"\n sx={{ position: \"relative\", height: \"100%\" }}\n onMouseEnter={() => {\n setIsHovered(true);\n }}\n onMouseLeave={() => {\n setIsHovered(false);\n }}\n >\n {isSingleEnv ? (\n <CodeEditor\n language=\"sql\"\n value={original ?? \"\"}\n readOnly={true}\n lineNumbers={true}\n wordWrap={false}\n theme={isDark ? \"dark\" : \"light\"}\n />\n ) : (\n <DiffEditor\n original={original ?? \"\"}\n modified={modified ?? \"\"}\n language=\"sql\"\n readOnly={true}\n lineNumbers={true}\n sideBySide={false} // Inline diff mode\n theme={isDark ? \"dark\" : \"light\"}\n height=\"100%\"\n />\n )}\n <IconButton\n onClick={() => setIsOpen(true)}\n size=\"medium\"\n aria-label=\"Expand\"\n sx={{\n position: \"absolute\",\n top: \"5px\",\n right: \"20px\",\n opacity: isHovered ? 0.5 : 0.1,\n transition: \"opacity 0.3s ease-in-out\",\n }}\n >\n <FaExpandArrowsAlt />\n </IconButton>\n <MuiDialog\n open={isOpen}\n onClose={() => setIsOpen(false)}\n maxWidth=\"sm\"\n fullWidth\n slotProps={{\n paper: { sx: { height: \"75%\", overflowY: \"auto\" } },\n }}\n >\n <DialogTitle sx={{ display: \"flex\", alignItems: \"center\" }}>\n {isSingleEnv ? (\n <>\n <code>{modelName}</code>&nbsp;Model Code\n </>\n ) : (\n <>\n <code>{modelName}</code>&nbsp;Model Code Diff\n </>\n )}\n <Box sx={{ flex: 1 }} />\n <IconButton size=\"small\" onClick={() => setIsOpen(false)}>\n <IoClose />\n </IconButton>\n </DialogTitle>\n <DialogContent>\n {isSingleEnv ? (\n <CodeEditor\n language=\"sql\"\n value={original ?? \"\"}\n fontSize={16}\n readOnly={true}\n lineNumbers={true}\n wordWrap={false}\n theme={isDark ? \"dark\" : \"light\"}\n />\n ) : (\n <DiffEditor\n original={original ?? \"\"}\n modified={modified ?? \"\"}\n language=\"sql\"\n theme={isDark ? \"dark\" : \"light\"}\n className=\"text-base\"\n />\n )}\n </DialogContent>\n </MuiDialog>\n </Box>\n );\n};\n","\"use client\";\n\nimport type { LineageGraphNode } from \"../..\";\nimport { useRecceServerFlag } from \"../../contexts\";\nimport { useIsDark } from \"../../hooks\";\nimport { CodeEditor, DiffEditor } from \"../../primitives\";\nimport { NodeSqlView as BaseNodeSqlView } from \"./NodeSqlView\";\n\ninterface NodeSqlViewProps {\n node: LineageGraphNode;\n}\n\n/**\n * wrapper for NodeSqlView that injects CodeMirror-based editors.\n *\n * This wrapper:\n * 1. Handles loading state from useRecceServerFlag\n * 2. Injects editor components (CodeEditor, DiffEditor)\n * 3. Provides dark mode detection via useIsDark hook\n *\n * The underlying BaseNodeSqlView from @datarecce/ui is framework-agnostic\n * and accepts editor components as props for dependency injection.\n */\nexport const NodeSqlViewOss = ({ node }: NodeSqlViewProps) => {\n const { data: flags, isLoading } = useRecceServerFlag();\n const isDark = useIsDark();\n\n if (isLoading) {\n return <></>;\n }\n\n return (\n <BaseNodeSqlView\n node={node}\n isSingleEnv={flags?.single_env_onboarding ?? false}\n CodeEditor={CodeEditor}\n DiffEditor={DiffEditor}\n isDark={isDark}\n />\n );\n};\n","/**\n * @file tagStyles.ts\n * @description Shared styling utilities for lineage node tags\n *\n * Provides reusable styles for tag components that display information\n * in lineage graph nodes (resource type, row count, etc.).\n *\n * Source: Extracted from OSS js/src/components/lineage/NodeTag.tsx\n */\n\nimport type { SxProps, Theme } from \"@mui/material/styles\";\n\n/**\n * Get root styles for tag components\n *\n * Creates a pill-shaped container with theme-aware colors.\n *\n * @param isDark - Whether dark mode is active\n * @returns SxProps for the tag container\n *\n * @example\n * ```tsx\n * const isDark = useIsDark();\n * <Box sx={getTagRootSx(isDark)}>Tag content</Box>\n * ```\n */\nexport const getTagRootSx = (isDark: boolean): SxProps<Theme> => ({\n display: \"inline-flex\",\n alignItems: \"center\",\n borderRadius: 16,\n px: 1,\n py: 0.25,\n fontSize: \"0.75rem\",\n bgcolor: isDark ? \"grey.700\" : \"grey.100\",\n color: isDark ? \"grey.100\" : \"inherit\",\n});\n\n/**\n * Styles for the leading element (icon) in a tag\n *\n * Provides consistent spacing and alignment for icons at the start of tags.\n *\n * @example\n * ```tsx\n * <Box sx={tagStartElementSx}>\n * <MyIcon />\n * </Box>\n * ```\n */\nexport const tagStartElementSx: SxProps<Theme> = {\n mr: 0.5,\n display: \"flex\",\n alignItems: \"center\",\n};\n","\"use client\";\n\n/**\n * @file ResourceTypeTag.tsx\n * @description Pure presentation component for displaying resource type with icon\n *\n * Shows the resource type (model, source, seed, etc.) as a tag with an icon.\n * Uses theme-aware styling for light/dark mode support.\n *\n * Source: Migrated from OSS js/src/components/lineage/NodeTag.tsx\n */\n\nimport Box from \"@mui/material/Box\";\nimport Tooltip from \"@mui/material/Tooltip\";\nimport { memo } from \"react\";\nimport { useIsDark } from \"../../../hooks/useIsDark\";\nimport { getIconForResourceType } from \"../styles\";\nimport { getTagRootSx, tagStartElementSx } from \"./tagStyles\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Data required for ResourceTypeTag\n */\nexport interface ResourceTypeTagData {\n /** The resource type to display (model, source, seed, snapshot, etc.) */\n resourceType?: string;\n}\n\n/**\n * Props for ResourceTypeTag component\n */\nexport interface ResourceTypeTagProps {\n /** Node data containing the resource type */\n data: ResourceTypeTagData;\n /** Test ID for testing */\n \"data-testid\"?: string;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * ResourceTypeTag - Displays the resource type with an icon\n *\n * Shows a pill-shaped tag with an icon representing the resource type\n * (model, source, seed, snapshot, metric, exposure, semantic_model).\n *\n * @example\n * ```tsx\n * // Basic usage\n * <ResourceTypeTag data={{ resourceType: \"model\" }} />\n *\n * // With snapshot type\n * <ResourceTypeTag data={{ resourceType: \"snapshot\" }} />\n * ```\n */\nfunction ResourceTypeTagComponent({\n data,\n \"data-testid\": testId,\n}: ResourceTypeTagProps) {\n const isDark = useIsDark();\n const { icon: ResourceTypeIcon } = getIconForResourceType(data.resourceType);\n\n return (\n <Tooltip arrow title=\"Type of resource\">\n <Box component=\"span\" sx={getTagRootSx(isDark)} data-testid={testId}>\n {ResourceTypeIcon && (\n <Box component=\"span\" sx={tagStartElementSx}>\n <ResourceTypeIcon />\n </Box>\n )}\n {data.resourceType}\n </Box>\n </Tooltip>\n );\n}\n\nexport const ResourceTypeTag = memo(ResourceTypeTagComponent);\nResourceTypeTag.displayName = \"ResourceTypeTag\";\n","/**\n * @file NodeTag.tsx\n * @description Tag components for lineage graph nodes\n *\n * Includes tag components that rely on app-level dependencies:\n * - RowCountDiffTag: Shows row count comparison between base and current\n * - RowCountTag: Shows current row count (single env mode)\n */\n\nimport Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Skeleton from \"@mui/material/Skeleton\";\nimport Stack from \"@mui/material/Stack\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport { FiArrowRight } from \"react-icons/fi\";\nimport { PiRepeat } from \"react-icons/pi\";\nimport { RiArrowDownSFill, RiArrowUpSFill, RiSwapLine } from \"react-icons/ri\";\nimport type { RowCount, RowCountDiff } from \"../../api\";\nimport {\n useLineageGraphContext,\n useRecceInstanceContext,\n} from \"../../contexts\";\nimport type { LineageGraphNode } from \"../../contexts/lineage/types\";\nimport { useIsDark } from \"../../hooks\";\nimport { deltaPercentageString } from \"../../utils\";\nimport { SetupConnectionPopover } from \"../app\";\nimport { findByRunType } from \"../run\";\nimport { getTagRootSx, tagStartElementSx } from \"./tags\";\n\n// =============================================================================\n// INTERNAL COMPONENTS\n// =============================================================================\n\nfunction _RowCountByRate({ rowCount }: { rowCount: RowCountDiff }) {\n const base = rowCount.base;\n const current = rowCount.curr;\n const baseLabel = rowCount.base === null ? \"N/A\" : `${rowCount.base} rows`;\n const currentLabel = rowCount.curr === null ? \"N/A\" : `${rowCount.curr} rows`;\n\n if (base === null && current === null) {\n return <> Failed to load</>;\n }\n if (base === null || current === null) {\n return (\n <Stack direction=\"row\" alignItems=\"center\" spacing={0.5}>\n <Typography variant=\"body2\" component=\"span\">\n {baseLabel}\n </Typography>\n <FiArrowRight />\n <Typography variant=\"body2\" component=\"span\">\n {currentLabel}\n </Typography>\n </Stack>\n );\n }\n if (base === current) {\n return (\n <Stack direction=\"row\" alignItems=\"center\" spacing={0.5}>\n <Typography variant=\"body2\" component=\"span\">\n {currentLabel}\n </Typography>\n <Box component=\"span\" sx={{ color: \"grey.500\", display: \"flex\" }}>\n <RiSwapLine />\n </Box>\n <Typography variant=\"body2\" component=\"span\" sx={{ color: \"grey.500\" }}>\n No Change\n </Typography>\n </Stack>\n );\n }\n if (base < current) {\n return (\n <Stack direction=\"row\" alignItems=\"center\" spacing={0.5}>\n <Typography variant=\"body2\" component=\"span\">\n {currentLabel}\n </Typography>\n <Box component=\"span\" sx={{ color: \"success.main\", display: \"flex\" }}>\n <RiArrowUpSFill />\n </Box>\n <Typography\n variant=\"body2\"\n component=\"span\"\n sx={{ color: \"success.main\" }}\n >\n {deltaPercentageString(base, current)}\n </Typography>\n </Stack>\n );\n }\n return (\n <Stack direction=\"row\" alignItems=\"center\" spacing={0.5}>\n <Typography variant=\"body2\" component=\"span\">\n {currentLabel}\n </Typography>\n <Box component=\"span\" sx={{ color: \"error.main\", display: \"flex\" }}>\n <RiArrowDownSFill />\n </Box>\n <Typography variant=\"body2\" component=\"span\" sx={{ color: \"error.main\" }}>\n {deltaPercentageString(base, current)}\n </Typography>\n </Stack>\n );\n}\n\n// =============================================================================\n// EXPORTED COMPONENTS\n// =============================================================================\n\nexport interface RowCountDiffTagProps {\n node: LineageGraphNode;\n rowCount?: RowCountDiff;\n onRefresh?: () => void;\n isFetching?: boolean;\n error?: Error | null;\n}\n\n/**\n * RowCountDiffTag - Shows row count comparison between base and current\n *\n * This component is app-specific because it requires:\n * - SetupConnectionPopover for database connection prompts\n * - findByRunType for getting run type icons from registry\n * - runsAggregated context for cached row count data\n */\nexport function RowCountDiffTag({\n rowCount: fetchedRowCount,\n node,\n onRefresh,\n isFetching,\n}: RowCountDiffTagProps) {\n const isDark = useIsDark();\n const { featureToggles } = useRecceInstanceContext();\n const { runsAggregated } = useLineageGraphContext();\n const lastRowCount: RowCountDiff | undefined = runsAggregated?.[node.id]\n ?.row_count_diff.result as RowCountDiff | undefined;\n const RunTypeIcon = findByRunType(\"row_count_diff\").icon;\n\n // Calculate during render instead of effect\n const rowCount = fetchedRowCount ?? lastRowCount;\n const rowsToShow = rowCount;\n const label = rowCount\n ? `${rowCount.base ?? \"N/A\"} -> ${rowCount.curr ?? \"N/A\"} rows`\n : \"\";\n\n return (\n <MuiTooltip title={label}>\n <SetupConnectionPopover display={featureToggles.mode === \"metadata only\"}>\n <Box\n component=\"span\"\n sx={{\n ...getTagRootSx(isDark),\n gap: 0.5,\n }}\n >\n <RunTypeIcon />\n {rowsToShow != null || isFetching ? (\n isFetching ? (\n <Skeleton width={30} height={16} />\n ) : rowsToShow != null ? (\n <_RowCountByRate rowCount={rowsToShow} />\n ) : (\n <Typography variant=\"caption\">row count</Typography>\n )\n ) : (\n <Typography variant=\"caption\">row count</Typography>\n )}\n {onRefresh && (\n <IconButton\n aria-label=\"Query Row Count\"\n size=\"small\"\n onClick={onRefresh}\n disabled={featureToggles.disableDatabaseQuery}\n sx={{ p: 0, ml: 0.5 }}\n >\n <PiRepeat size={12} />\n </IconButton>\n )}\n </Box>\n </SetupConnectionPopover>\n </MuiTooltip>\n );\n}\n\nexport interface RowCountTagProps {\n node: LineageGraphNode;\n rowCount?: RowCount;\n onRefresh?: () => void;\n isFetching?: boolean;\n error?: Error | null;\n}\n\n/**\n * RowCountTag - Shows current row count (single environment mode)\n *\n * This component is app-specific because it requires:\n * - findByRunType for getting run type icons from registry\n * - runsAggregated context for cached row count data\n */\nexport function RowCountTag({\n rowCount: fetchedRowCount,\n node,\n onRefresh,\n isFetching,\n}: RowCountTagProps) {\n const isDark = useIsDark();\n const { runsAggregated } = useLineageGraphContext();\n const lastRowCount: RowCountDiff | undefined = runsAggregated?.[node.id]\n ?.row_count.result as RowCountDiff | undefined;\n\n const RunTypeIcon = findByRunType(\"row_count\").icon;\n\n let label;\n const rowCount = fetchedRowCount ?? lastRowCount;\n if (rowCount) {\n const rows = rowCount.curr ?? \"N/A\";\n label = `${rows} rows`;\n }\n\n return (\n <Box component=\"span\" sx={getTagRootSx(isDark)}>\n <Box component=\"span\" sx={tagStartElementSx}>\n <RunTypeIcon />\n </Box>\n {rowCount || isFetching ? (\n isFetching ? (\n <Skeleton width={30} height={16} />\n ) : (\n <Typography variant=\"caption\">{label}</Typography>\n )\n ) : (\n <Typography variant=\"caption\">row count</Typography>\n )}\n {onRefresh && (\n <IconButton\n aria-label=\"Query Row Count\"\n size=\"small\"\n onClick={onRefresh}\n disabled={node.data.from === \"base\"}\n sx={{ p: 0, ml: 0.5 }}\n >\n <PiRepeat size={12} />\n </IconButton>\n )}\n </Box>\n );\n}\n","\"use client\";\n\nimport Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Stack from \"@mui/material/Stack\";\nimport Tab from \"@mui/material/Tab\";\nimport Tabs from \"@mui/material/Tabs\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport {\n type ComponentType,\n type ReactElement,\n type ReactNode,\n useState,\n} from \"react\";\nimport { IoClose } from \"react-icons/io5\";\n\nimport { DisableTooltipMessages } from \"../../constants\";\nimport type { NodeSqlViewProps } from \"./NodeSqlView\";\n\n// =============================================================================\n// TYPE DEFINITIONS\n// =============================================================================\n\n/**\n * Node data structure for NodeView.\n * Represents the data needed to display node details.\n */\nexport interface NodeViewNodeData {\n id: string;\n data: {\n name: string;\n resourceType?: string;\n changeStatus?: string;\n from?: string;\n data: {\n base?: {\n raw_code?: string;\n name?: string;\n columns?: Record<string, unknown>;\n };\n current?: {\n raw_code?: string;\n name?: string;\n columns?: Record<string, unknown>;\n };\n };\n };\n}\n\n/**\n * Run type icon configuration for dependency injection.\n * Maps run type names to their icon components.\n */\nexport interface RunTypeIconMap {\n query?: ComponentType<{ fontSize?: string }>;\n row_count?: ComponentType<{ fontSize?: string }>;\n row_count_diff?: ComponentType<{ fontSize?: string }>;\n profile?: ComponentType<{ fontSize?: string }>;\n profile_diff?: ComponentType<{ fontSize?: string }>;\n query_diff?: ComponentType<{ fontSize?: string }>;\n value_diff?: ComponentType<{ fontSize?: string }>;\n top_k_diff?: ComponentType<{ fontSize?: string }>;\n histogram_diff?: ComponentType<{ fontSize?: string }>;\n schema_diff?: ComponentType<{ fontSize?: string }>;\n sandbox?: ComponentType<{ fontSize?: string }>;\n}\n\n/**\n * Callbacks for action button clicks.\n * Used for dependency injection of action handlers.\n */\nexport interface NodeViewActionCallbacks {\n /** Called when Query button is clicked */\n onQueryClick?: () => void;\n /** Called when Row Count button is clicked */\n onRowCountClick?: () => void;\n /** Called when Row Count Diff button is clicked */\n onRowCountDiffClick?: () => void;\n /** Called when Profile button is clicked */\n onProfileClick?: () => void;\n /** Called when Profile Diff button is clicked */\n onProfileDiffClick?: () => void;\n /** Called when Query Diff button is clicked */\n onQueryDiffClick?: () => void;\n /** Called when Value Diff button is clicked */\n onValueDiffClick?: () => void;\n /** Called when Top-K Diff button is clicked */\n onTopKDiffClick?: () => void;\n /** Called when Histogram Diff button is clicked */\n onHistogramDiffClick?: () => void;\n /** Called when Add Schema Diff button is clicked */\n onAddSchemaDiffClick?: () => void;\n /** Called when Sandbox button is clicked */\n onSandboxClick?: () => void;\n}\n\n/**\n * Props for NodeView component.\n *\n * Uses dependency injection for:\n * - Schema view components (for different consumers)\n * - SQL view component (NodeSqlView)\n * - Action button icons\n * - Notification components\n * - Connection popover wrapper\n *\n * Note: Injected component types use `any` to allow consumers to provide\n * components with more specific prop types than the base interface requires.\n * The consumer is responsible for ensuring type compatibility.\n */\nexport interface NodeViewProps {\n /** The node to display */\n node: NodeViewNodeData;\n /** Callback when close button is clicked */\n onCloseNode: () => void;\n /** Whether in single environment mode */\n isSingleEnv: boolean;\n /** Feature toggles for conditional UI */\n featureToggles?: {\n mode?: string | null;\n disableDatabaseQuery?: boolean;\n };\n\n // =========================================================================\n // DEPENDENCY INJECTION: Components\n // =========================================================================\n // Using ComponentType<any> for flexibility - consumers provide their own types\n\n /**\n * Schema view component for diff mode.\n * Should accept: { base?: NodeData, current?: NodeData }\n */\n // biome-ignore lint/suspicious/noExplicitAny: DI pattern requires flexible component types\n SchemaView?: ComponentType<any>;\n /**\n * Schema view component for single env mode.\n * Should accept: { current?: NodeData }\n */\n // biome-ignore lint/suspicious/noExplicitAny: DI pattern requires flexible component types\n SingleEnvSchemaView?: ComponentType<any>;\n /**\n * Node SQL view component.\n * Should accept: { node: LineageGraphNode }\n */\n // biome-ignore lint/suspicious/noExplicitAny: DI pattern requires flexible component types\n NodeSqlView?: ComponentType<any>;\n /**\n * Row count diff tag component.\n * Should accept: { node: LineageGraphNode, onRefresh?: () => void }\n */\n // biome-ignore lint/suspicious/noExplicitAny: DI pattern requires flexible component types\n RowCountDiffTag?: ComponentType<any>;\n /**\n * Row count tag component (single env).\n * Should accept: { node: LineageGraphNode, onRefresh?: () => void }\n */\n // biome-ignore lint/suspicious/noExplicitAny: DI pattern requires flexible component types\n RowCountTag?: ComponentType<any>;\n /**\n * Resource type tag component.\n * Should accept: { node: LineageGraphNode }\n */\n // biome-ignore lint/suspicious/noExplicitAny: DI pattern requires flexible component types\n ResourceTypeTag?: ComponentType<any>;\n /**\n * Notification component for single env mode.\n * Should accept: { onClose: () => void, children: ReactNode }\n */\n // biome-ignore lint/suspicious/noExplicitAny: DI pattern requires flexible component types\n NotificationComponent?: ComponentType<any>;\n /**\n * Wrapper component for buttons that need connection popover.\n * Should accept: { display: boolean, children: ReactNode }\n */\n // biome-ignore lint/suspicious/noExplicitAny: DI pattern requires flexible component types\n ConnectionPopoverWrapper?: ComponentType<any>;\n /**\n * Sandbox dialog component.\n * Should accept: { isOpen: boolean, onClose: () => void, current?: NodeData }\n */\n // biome-ignore lint/suspicious/noExplicitAny: DI pattern requires flexible component types\n SandboxDialog?: ComponentType<any>;\n\n // =========================================================================\n // DEPENDENCY INJECTION: Icons\n // =========================================================================\n\n /** Map of run type names to icon components */\n runTypeIcons?: RunTypeIconMap;\n\n // =========================================================================\n // DEPENDENCY INJECTION: Callbacks\n // =========================================================================\n\n /** Action callbacks for button clicks */\n actionCallbacks?: NodeViewActionCallbacks;\n /** Check if an action is available */\n isActionAvailable?: (runType: string) => boolean;\n}\n\n// =============================================================================\n// INTERNAL COMPONENTS\n// =============================================================================\n\ninterface TabPanelProps {\n children?: ReactNode;\n index: number;\n value: number;\n}\n\nfunction TabPanel({ children, value, index }: TabPanelProps) {\n return value === index ? <>{children}</> : null;\n}\n\n// =============================================================================\n// DEFAULT IMPLEMENTATIONS\n// =============================================================================\n\n/** Default icon placeholder when no icon is provided */\nconst DefaultIcon = () => <span />;\n\n/** Default connection wrapper that just renders children */\nconst DefaultConnectionWrapper = ({\n children,\n}: {\n display: boolean;\n children: ReactNode;\n}) => <>{children}</>;\n\n/** Default check for action availability - always available */\nconst defaultIsActionAvailable = () => true;\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\n/**\n * Gets the disable reason for an action button.\n */\nfunction getDisableReason(\n isAddedOrRemoved: boolean,\n runType: string,\n isActionAvailable: (runType: string) => boolean,\n): string {\n if (isAddedOrRemoved) {\n return DisableTooltipMessages.add_or_remove;\n }\n if (!isActionAvailable(runType)) {\n return \"This action is not supported yet.\";\n }\n return \"\";\n}\n\n// =============================================================================\n// SUB-COMPONENTS\n// =============================================================================\n\ninterface SingleEnvActionButtonsProps {\n node: NodeViewNodeData;\n actionCallbacks?: NodeViewActionCallbacks;\n runTypeIcons?: RunTypeIconMap;\n isActionAvailable: (runType: string) => boolean;\n}\n\nfunction SingleEnvActionButtons({\n node,\n actionCallbacks,\n runTypeIcons,\n isActionAvailable,\n}: SingleEnvActionButtonsProps) {\n const isAddedOrRemoved =\n node.data.changeStatus === \"added\" || node.data.changeStatus === \"removed\";\n\n const QueryIcon = runTypeIcons?.query ?? DefaultIcon;\n const RowCountIcon = runTypeIcons?.row_count ?? DefaultIcon;\n const ProfileIcon = runTypeIcons?.profile ?? DefaultIcon;\n\n return (\n <Stack direction=\"row\" alignItems=\"center\" flexWrap=\"wrap\" gap={1}>\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<QueryIcon fontSize=\"small\" />}\n onClick={actionCallbacks?.onQueryClick}\n sx={{ textTransform: \"none\" }}\n >\n Query\n </Button>\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<RowCountIcon fontSize=\"small\" />}\n onClick={actionCallbacks?.onRowCountClick}\n sx={{ textTransform: \"none\" }}\n >\n Row Count\n </Button>\n <MuiTooltip\n title={getDisableReason(isAddedOrRemoved, \"profile\", isActionAvailable)}\n placement=\"top\"\n >\n <span>\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<ProfileIcon fontSize=\"small\" />}\n onClick={actionCallbacks?.onProfileClick}\n disabled={isAddedOrRemoved}\n sx={{ textTransform: \"none\" }}\n >\n Profile\n </Button>\n </span>\n </MuiTooltip>\n </Stack>\n );\n}\n\ninterface ExploreHeaderButtonsProps {\n node: NodeViewNodeData;\n actionCallbacks?: NodeViewActionCallbacks;\n runTypeIcons?: RunTypeIconMap;\n featureToggles?: NodeViewProps[\"featureToggles\"];\n ConnectionPopoverWrapper: ComponentType<{\n display: boolean;\n children: ReactNode;\n }>;\n}\n\nfunction ExploreHeaderButtons({\n actionCallbacks,\n runTypeIcons,\n featureToggles,\n ConnectionPopoverWrapper,\n}: ExploreHeaderButtonsProps) {\n const metadataOnly = featureToggles?.mode === \"metadata only\";\n\n const SchemaDiffIcon = runTypeIcons?.schema_diff ?? DefaultIcon;\n const SandboxIcon = runTypeIcons?.sandbox ?? DefaultIcon;\n\n return (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n sx={{ mr: 1 }}\n flexWrap=\"wrap\"\n gap={1}\n >\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<SchemaDiffIcon fontSize=\"small\" />}\n onClick={actionCallbacks?.onAddSchemaDiffClick}\n sx={{ textTransform: \"none\" }}\n >\n Add schema diff to checklist\n </Button>\n <ConnectionPopoverWrapper display={metadataOnly}>\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<SandboxIcon fontSize=\"small\" />}\n onClick={actionCallbacks?.onSandboxClick}\n disabled={featureToggles?.disableDatabaseQuery}\n sx={{ textTransform: \"none\" }}\n >\n Sandbox\n </Button>\n </ConnectionPopoverWrapper>\n </Stack>\n );\n}\n\ninterface DiffActionButtonsProps {\n node: NodeViewNodeData;\n actionCallbacks?: NodeViewActionCallbacks;\n runTypeIcons?: RunTypeIconMap;\n featureToggles?: NodeViewProps[\"featureToggles\"];\n isActionAvailable: (runType: string) => boolean;\n ConnectionPopoverWrapper: ComponentType<{\n display: boolean;\n children: ReactNode;\n }>;\n}\n\nfunction DiffActionButtons({\n node,\n actionCallbacks,\n runTypeIcons,\n featureToggles,\n isActionAvailable,\n ConnectionPopoverWrapper,\n}: DiffActionButtonsProps) {\n const metadataOnly = featureToggles?.mode === \"metadata only\";\n const isAddedOrRemoved =\n node.data.changeStatus === \"added\" || node.data.changeStatus === \"removed\";\n\n const QueryDiffIcon = runTypeIcons?.query_diff ?? DefaultIcon;\n const RowCountDiffIcon = runTypeIcons?.row_count_diff ?? DefaultIcon;\n const ProfileDiffIcon = runTypeIcons?.profile_diff ?? DefaultIcon;\n const ValueDiffIcon = runTypeIcons?.value_diff ?? DefaultIcon;\n const TopKDiffIcon = runTypeIcons?.top_k_diff ?? DefaultIcon;\n const HistogramDiffIcon = runTypeIcons?.histogram_diff ?? DefaultIcon;\n\n const wrapButton = (\n button: ReactElement<{\n ref?: React.Ref<HTMLElement>;\n [key: string]: unknown;\n }>,\n runType: string,\n ) => {\n if (metadataOnly) {\n return (\n <ConnectionPopoverWrapper display={true}>\n {button}\n </ConnectionPopoverWrapper>\n );\n }\n\n const tooltipContent = getDisableReason(\n isAddedOrRemoved,\n runType,\n isActionAvailable,\n );\n return (\n <MuiTooltip title={tooltipContent} placement=\"top\">\n <span>{button}</span>\n </MuiTooltip>\n );\n };\n\n return (\n <Stack direction=\"row\" alignItems=\"center\" flexWrap=\"wrap\" gap={2}>\n <Typography variant=\"caption\" fontWeight=\"bold\">\n Diff\n </Typography>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n flexWrap=\"wrap\"\n gap={1}\n width=\"93%\"\n >\n <ConnectionPopoverWrapper display={metadataOnly}>\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<RowCountDiffIcon fontSize=\"small\" />}\n onClick={actionCallbacks?.onRowCountDiffClick}\n disabled={featureToggles?.disableDatabaseQuery}\n sx={{ textTransform: \"none\" }}\n >\n Row Count\n </Button>\n </ConnectionPopoverWrapper>\n {wrapButton(\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<ProfileDiffIcon fontSize=\"small\" />}\n onClick={actionCallbacks?.onProfileDiffClick}\n disabled={isAddedOrRemoved || featureToggles?.disableDatabaseQuery}\n sx={{ textTransform: \"none\" }}\n >\n Profile\n </Button>,\n \"profile_diff\",\n )}\n {wrapButton(\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<ValueDiffIcon fontSize=\"small\" />}\n onClick={actionCallbacks?.onValueDiffClick}\n disabled={isAddedOrRemoved || featureToggles?.disableDatabaseQuery}\n sx={{ textTransform: \"none\" }}\n >\n Value\n </Button>,\n \"value_diff\",\n )}\n {wrapButton(\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<TopKDiffIcon fontSize=\"small\" />}\n onClick={actionCallbacks?.onTopKDiffClick}\n disabled={isAddedOrRemoved || featureToggles?.disableDatabaseQuery}\n sx={{ textTransform: \"none\" }}\n >\n Top-K\n </Button>,\n \"top_k_diff\",\n )}\n {wrapButton(\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<HistogramDiffIcon fontSize=\"small\" />}\n onClick={actionCallbacks?.onHistogramDiffClick}\n disabled={isAddedOrRemoved || featureToggles?.disableDatabaseQuery}\n sx={{ textTransform: \"none\" }}\n >\n Histogram\n </Button>,\n \"histogram_diff\",\n )}\n <ConnectionPopoverWrapper display={metadataOnly}>\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<QueryDiffIcon fontSize=\"small\" />}\n onClick={actionCallbacks?.onQueryDiffClick}\n disabled={featureToggles?.disableDatabaseQuery}\n sx={{ textTransform: \"none\" }}\n >\n Query\n </Button>\n </ConnectionPopoverWrapper>\n </Stack>\n </Stack>\n );\n}\n\n// =============================================================================\n// MAIN COMPONENT\n// =============================================================================\n\n/**\n * NodeView Component\n *\n * Displays detailed information about a lineage node including:\n * - Node name and metadata\n * - Action buttons for various operations (Query, Profile, Diff, etc.)\n * - Tabs for Columns and Code views\n *\n * Uses dependency injection for:\n * - Schema view components (different for OSS vs Cloud)\n * - Action button handlers\n * - Icon components from run registry\n * - Connection popover for database setup prompts\n *\n * @example\n * ```tsx\n * import { NodeView } from '@datarecce/ui/components/lineage';\n *\n * <NodeView\n * node={selectedNode}\n * onCloseNode={() => setSelectedNode(null)}\n * isSingleEnv={false}\n * SchemaView={MySchemaView}\n * NodeSqlView={MyNodeSqlView}\n * actionCallbacks={{\n * onQueryClick: handleQuery,\n * onProfileDiffClick: handleProfileDiff,\n * }}\n * />\n * ```\n */\nexport function NodeView({\n node,\n onCloseNode,\n isSingleEnv,\n featureToggles,\n // Injected components\n SchemaView,\n SingleEnvSchemaView,\n NodeSqlView,\n RowCountDiffTag,\n RowCountTag,\n ResourceTypeTag,\n NotificationComponent,\n ConnectionPopoverWrapper = DefaultConnectionWrapper,\n SandboxDialog,\n // Injected icons\n runTypeIcons,\n // Injected callbacks\n actionCallbacks,\n isActionAvailable = defaultIsActionAvailable,\n}: NodeViewProps) {\n const withColumns =\n node.data.resourceType === \"model\" ||\n node.data.resourceType === \"seed\" ||\n node.data.resourceType === \"source\" ||\n node.data.resourceType === \"snapshot\";\n\n const [isSandboxOpen, setIsSandboxOpen] = useState(false);\n const [isNotificationOpen, setIsNotificationOpen] = useState(true);\n const [tabValue, setTabValue] = useState(0);\n\n const isModelSeedOrSnapshot =\n node.data.resourceType === \"model\" ||\n node.data.resourceType === \"seed\" ||\n node.data.resourceType === \"snapshot\";\n\n // Extended callbacks that include sandbox open\n const extendedCallbacks: NodeViewActionCallbacks = {\n ...actionCallbacks,\n onSandboxClick: () => {\n actionCallbacks?.onSandboxClick?.();\n setIsSandboxOpen(true);\n },\n };\n\n return (\n <Box\n sx={{\n height: \"100%\",\n display: \"grid\",\n gridTemplateRows: \"auto auto auto 1fr\",\n }}\n >\n {/* Header row: name + close button */}\n <Stack direction=\"row\" alignItems=\"center\">\n <Box sx={{ flex: \"0 1 20%\", p: 2 }}>\n <Typography\n variant=\"subtitle1\"\n fontWeight={600}\n className=\"no-track-pii-safe\"\n >\n {node.data.name}\n </Typography>\n </Box>\n <Box sx={{ flexGrow: 1 }} />\n {!isSingleEnv && isModelSeedOrSnapshot && (\n <ExploreHeaderButtons\n node={node}\n actionCallbacks={extendedCallbacks}\n runTypeIcons={runTypeIcons}\n featureToggles={featureToggles}\n ConnectionPopoverWrapper={ConnectionPopoverWrapper}\n />\n )}\n <Box sx={{ flex: \"0 1 1%\" }}>\n <IconButton size=\"small\" onClick={onCloseNode}>\n <IoClose />\n </IconButton>\n </Box>\n </Stack>\n\n {/* Tags row: resource type, row count */}\n <Box sx={{ color: \"text.secondary\", pl: 2 }}>\n <Stack direction=\"row\" spacing={1}>\n {ResourceTypeTag && <ResourceTypeTag node={node} />}\n {isModelSeedOrSnapshot &&\n (isSingleEnv\n ? RowCountTag && (\n <RowCountTag\n node={node}\n onRefresh={actionCallbacks?.onRowCountClick}\n />\n )\n : RowCountDiffTag && (\n <RowCountDiffTag\n node={node}\n onRefresh={actionCallbacks?.onRowCountDiffClick}\n />\n ))}\n </Stack>\n </Box>\n\n {/* Action buttons row */}\n {isModelSeedOrSnapshot && (\n <Box sx={{ pl: 2, py: 1 }}>\n {isSingleEnv ? (\n <SingleEnvActionButtons\n node={node}\n actionCallbacks={actionCallbacks}\n runTypeIcons={runTypeIcons}\n isActionAvailable={isActionAvailable}\n />\n ) : (\n <DiffActionButtons\n node={node}\n actionCallbacks={extendedCallbacks}\n runTypeIcons={runTypeIcons}\n featureToggles={featureToggles}\n isActionAvailable={isActionAvailable}\n ConnectionPopoverWrapper={ConnectionPopoverWrapper}\n />\n )}\n </Box>\n )}\n\n {/* Content area: tabs for columns and code */}\n {withColumns && (\n <Box\n sx={{ overflow: \"auto\", display: \"flex\", flexDirection: \"column\" }}\n >\n {/* Notification for single env mode */}\n {isSingleEnv && isNotificationOpen && NotificationComponent && (\n <Box sx={{ p: 1.5 }}>\n <NotificationComponent\n onClose={() => setIsNotificationOpen(false)}\n >\n <Typography variant=\"body2\">\n Enable the Recce Checklist and start adding checks for better\n data validation and review.\n </Typography>\n </NotificationComponent>\n </Box>\n )}\n\n {/* Tabs */}\n <Tabs\n value={tabValue}\n onChange={(_, newValue) => setTabValue(newValue)}\n sx={{ borderBottom: 1, borderColor: \"divider\" }}\n >\n <Tab label=\"Columns\" />\n <Tab label=\"Code\" />\n </Tabs>\n\n {/* Tab panels */}\n <Box sx={{ overflow: \"auto\", height: \"calc(100% - 48px)\" }}>\n <TabPanel value={tabValue} index={0}>\n <Box sx={{ overflowY: \"auto\", height: \"100%\" }}>\n {isSingleEnv\n ? SingleEnvSchemaView && (\n <SingleEnvSchemaView current={node.data.data.current} />\n )\n : SchemaView && (\n <SchemaView\n base={node.data.data.base}\n current={node.data.data.current}\n />\n )}\n </Box>\n </TabPanel>\n <TabPanel value={tabValue} index={1}>\n <Box sx={{ height: \"100%\" }}>\n {NodeSqlView && <NodeSqlView node={node} />}\n </Box>\n </TabPanel>\n </Box>\n </Box>\n )}\n\n {/* Sandbox dialog */}\n {SandboxDialog && (\n <SandboxDialog\n isOpen={isSandboxOpen}\n onClose={() => setIsSandboxOpen(false)}\n current={node.data.data.current}\n />\n )}\n </Box>\n );\n}\n","\"use client\";\n\nimport Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Chip from \"@mui/material/Chip\";\nimport MuiDialog from \"@mui/material/Dialog\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Stack from \"@mui/material/Stack\";\nimport { alpha } from \"@mui/material/styles\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport { format, formatDistanceToNow, parseISO } from \"date-fns\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport { AiOutlineExperiment } from \"react-icons/ai\";\nimport { IoClose } from \"react-icons/io5\";\nimport { VscFeedback } from \"react-icons/vsc\";\nimport { useLineageGraphContext } from \"../../contexts/lineage\";\nimport { colors } from \"../../theme\";\nimport { VSplit } from \"../ui/Split\";\n\n/**\n * Props for a diff editor component used in the sandbox.\n * Supports editing the modified version while keeping original read-only.\n */\nexport interface SandboxDiffEditorProps {\n original: string;\n modified: string;\n language?: string;\n readOnly?: boolean;\n lineNumbers?: boolean;\n sideBySide?: boolean;\n theme?: \"light\" | \"dark\";\n height?: string;\n onModifiedChange?: (value: string) => void;\n}\n\n/**\n * Node data structure representing model information for the sandbox.\n */\nexport interface SandboxNodeData {\n id?: string;\n name?: string;\n raw_code?: string;\n}\n\n/**\n * Props for the QueryForm slot component.\n */\nexport interface SandboxQueryFormProps {\n defaultPrimaryKeys: string[];\n onPrimaryKeysChange: (primaryKeys: string[]) => void;\n}\n\n/**\n * Props for the RunResultPane slot component.\n */\nexport interface SandboxRunResultPaneProps {\n onClose: () => void;\n disableAddToChecklist?: boolean;\n}\n\n/**\n * Tracking event types for the sandbox.\n */\nexport interface SandboxTrackingCallbacks {\n onPreviewChange?: (params: {\n action: \"run\" | \"close\";\n node?: string;\n status?: \"success\" | \"failure\";\n }) => void;\n onFeedbackSubmit?: (params: {\n feedback: \"like\" | \"dislike\" | \"form\";\n node?: string;\n }) => void;\n onSingleEnvironment?: (params: {\n action: string;\n from: string;\n node?: string;\n }) => void;\n}\n\n/**\n * Props for the SandboxView component.\n *\n * This component uses dependency injection for editor and form components\n * to avoid coupling to specific implementations.\n */\nexport interface SandboxViewProps {\n /**\n * Whether the sandbox dialog is open.\n */\n isOpen: boolean;\n\n /**\n * Callback when the dialog is closed.\n */\n onClose: () => void;\n\n /**\n * Current node data containing model info and SQL code.\n */\n current?: SandboxNodeData;\n\n /**\n * Height of the dialog (not used in fullscreen mode).\n */\n height?: string;\n\n /**\n * Diff editor component for SQL editing.\n * Should accept props matching SandboxDiffEditorProps interface.\n */\n // biome-ignore lint/suspicious/noExplicitAny: DI pattern requires flexible component types\n DiffEditor: ComponentType<any>;\n\n /**\n * Query form component for primary key selection.\n * Should accept props matching SandboxQueryFormProps interface.\n */\n // biome-ignore lint/suspicious/noExplicitAny: DI pattern requires flexible component types\n QueryForm: ComponentType<any>;\n\n /**\n * Run result pane component for displaying query results.\n * Should accept props matching SandboxRunResultPaneProps interface.\n */\n // biome-ignore lint/suspicious/noExplicitAny: DI pattern requires flexible component types\n RunResultPane: ComponentType<any>;\n\n /**\n * Whether dark mode is enabled.\n */\n isDark?: boolean;\n\n /**\n * Primary keys for query diffing.\n */\n primaryKeys?: string[];\n\n /**\n * Callback when primary keys change.\n */\n onPrimaryKeysChange?: (keys: string[]) => void;\n\n /**\n * Whether a query is currently running.\n */\n isPending?: boolean;\n\n /**\n * Callback to run the query.\n */\n onRunQuery?: () => void;\n\n /**\n * Callback when run result pane opens (before running query).\n */\n onRunResultOpen?: () => void;\n\n /**\n * Callback when modified code changes.\n */\n onModifiedCodeChange?: (code: string) => void;\n\n /**\n * Callback to show feedback toast.\n */\n onShowFeedback?: () => void;\n\n /**\n * Tracking callbacks for analytics.\n */\n tracking?: SandboxTrackingCallbacks;\n\n /**\n * Logo image URL for the header.\n * @default \"/logo/recce-logo-white.png\"\n */\n logoUrl?: string;\n\n /**\n * Brand name to display in header.\n * @default \"RECCE\"\n */\n brandName?: string;\n}\n\n/**\n * Helper function to format timestamp for display.\n */\nfunction formatTimestamp(timestamp: string): string {\n const date = parseISO(timestamp);\n return format(date, \"yyyy-MM-dd'T'HH:mm:ss\");\n}\n\ninterface SandboxTopBarProps {\n current?: SandboxNodeData;\n primaryKeys: string[];\n onPrimaryKeysChange: (primaryKeys: string[]) => void;\n onRunResultOpen: () => void;\n runQuery: () => void;\n isPending: boolean;\n // biome-ignore lint/suspicious/noExplicitAny: DI pattern requires flexible component types\n QueryForm: ComponentType<any>;\n}\n\nfunction SandboxTopBar({\n current,\n primaryKeys,\n onPrimaryKeysChange,\n onRunResultOpen,\n runQuery,\n isPending,\n QueryForm,\n}: SandboxTopBarProps) {\n return (\n <Stack\n direction=\"row\"\n justifyContent=\"flex-end\"\n alignItems=\"center\"\n sx={{\n p: \"4pt 8pt\",\n gap: \"5px\",\n height: \"54px\",\n borderBottom: \"1px solid\",\n borderBottomColor: \"divider\",\n flex: \"0 0 54px\",\n }}\n >\n <Box>\n <Typography\n variant=\"h6\"\n component=\"h2\"\n sx={{ display: \"flex\", alignItems: \"center\", gap: \"5px\" }}\n >\n <Box component={AiOutlineExperiment} sx={{ fontSize: \"1.2em\" }} />\n Sandbox\n </Typography>\n <Typography sx={{ fontSize: \"0.75rem\", color: \"grey.500\" }}>\n Compare the run results based on the modified SQL code of model{\" \"}\n <b>{current?.name}</b>\n </Typography>\n </Box>\n <Box sx={{ flexGrow: 1 }} />\n <QueryForm\n defaultPrimaryKeys={primaryKeys}\n onPrimaryKeysChange={onPrimaryKeysChange}\n />\n <MuiTooltip title=\"Run diff to see the changes\">\n <Button\n size=\"small\"\n sx={{ mt: \"16px\", fontSize: \"14px\" }}\n onClick={() => {\n onRunResultOpen();\n runQuery();\n }}\n color=\"iochmara\"\n variant=\"contained\"\n disabled={isPending}\n >\n {isPending ? \"Running...\" : \"Run Diff\"}\n </Button>\n </MuiTooltip>\n </Stack>\n );\n}\n\ninterface SandboxEditorLabelsProps {\n currentModelID: string;\n height?: string;\n flex?: string;\n isDark?: boolean;\n}\n\nfunction SandboxEditorLabels({\n currentModelID,\n height = \"32px\",\n flex = \"0 0 auto\",\n isDark = false,\n}: SandboxEditorLabelsProps) {\n const { lineageGraph, envInfo } = useLineageGraphContext();\n const widthOfBar = \"50%\";\n const margin = \"0 16px\";\n\n const currentTime = formatTimestamp(\n envInfo?.dbt?.current?.generated_at ?? \"\",\n );\n const latestUpdateDistanceToNow = formatDistanceToNow(currentTime, {\n addSuffix: true,\n });\n let schema = \"N/A\";\n if (lineageGraph?.nodes[currentModelID]) {\n const value = lineageGraph.nodes[currentModelID];\n if (value.data.data.current?.schema) {\n schema = value.data.data.current.schema;\n }\n }\n\n return (\n <Stack\n direction=\"row\"\n sx={{\n gap: 0,\n height,\n flex,\n fontSize: \"14px\",\n alignItems: \"center\",\n m: 0,\n bgcolor: isDark\n ? alpha(colors.neutral[700], 0.5)\n : alpha(colors.neutral[100], 0.5),\n }}\n >\n <Stack sx={{ width: widthOfBar }}>\n <Typography sx={{ fontWeight: \"bold\", margin }}>\n ORIGINAL (Schema: {schema}, Last Updated: {latestUpdateDistanceToNow})\n </Typography>\n </Stack>\n <Stack sx={{ width: widthOfBar }}>\n <Typography sx={{ fontWeight: \"bold\", margin }}>\n SANDBOX EDITOR\n </Typography>\n </Stack>\n </Stack>\n );\n}\n\ninterface SqlPreviewProps {\n current?: SandboxNodeData;\n onChange: (value: string) => void;\n isDark?: boolean;\n // biome-ignore lint/suspicious/noExplicitAny: DI pattern requires flexible component types\n DiffEditor: ComponentType<any>;\n}\n\nfunction SqlPreview({\n current,\n onChange,\n isDark,\n DiffEditor,\n}: SqlPreviewProps) {\n return (\n <DiffEditor\n original={current?.raw_code ?? \"\"}\n modified={current?.raw_code ?? \"\"}\n language=\"sql\"\n readOnly={false}\n lineNumbers={true}\n sideBySide={true}\n theme={isDark ? \"dark\" : \"light\"}\n height=\"100%\"\n onModifiedChange={onChange}\n />\n );\n}\n\n/**\n * SandboxView Component\n *\n * A modal dialog for previewing and comparing SQL code changes in a sandbox environment.\n * Allows editing modified SQL and running diff queries against the data warehouse.\n *\n * Components are injected as props to allow the consuming application\n * to provide its own implementations (e.g., specific editors, form components).\n */\nexport function SandboxView({\n isOpen,\n onClose,\n current,\n DiffEditor,\n QueryForm,\n RunResultPane,\n isDark = false,\n primaryKeys = [],\n onPrimaryKeysChange,\n isPending = false,\n onRunQuery,\n onRunResultOpen,\n onModifiedCodeChange,\n onShowFeedback,\n tracking,\n logoUrl = \"/logo/recce-logo-white.png\",\n brandName = \"RECCE\",\n}: SandboxViewProps) {\n const [isRunResultOpen, setIsRunResultOpen] = useState(false);\n\n const handleModifiedCodeChange = (code: string) => {\n onModifiedCodeChange?.(code);\n };\n\n const handleRunResultOpen = () => {\n setIsRunResultOpen(true);\n onRunResultOpen?.();\n };\n\n const handleRunQuery = () => {\n onRunQuery?.();\n };\n\n const handleClose = () => {\n onClose();\n setIsRunResultOpen(false);\n tracking?.onPreviewChange?.({ action: \"close\", node: current?.name });\n };\n\n const handlePrimaryKeysChange = (keys: string[]) => {\n onPrimaryKeysChange?.(keys);\n };\n\n return (\n <MuiDialog\n open={isOpen}\n onClose={handleClose}\n maxWidth={false}\n fullWidth\n slotProps={{\n paper: {\n sx: {\n width: \"100%\",\n height: \"100%\",\n maxWidth: \"100%\",\n maxHeight: \"100%\",\n m: 0,\n },\n },\n }}\n >\n <Box\n sx={{\n height: \"40px\",\n bgcolor: \"cyan.600\",\n px: 0,\n py: 2,\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n sx={{ height: \"100%\", gap: \"10px\" }}\n >\n <Box\n component=\"img\"\n sx={{ width: \"20px\", height: \"20px\", ml: \"18px\" }}\n src={logoUrl}\n alt=\"logo\"\n />\n <Typography\n variant=\"h6\"\n component=\"h1\"\n sx={{\n fontFamily: '\"Montserrat\", sans-serif',\n fontSize: \"1.125rem\",\n color: \"common.white\",\n }}\n >\n {brandName}\n </Typography>\n <Chip\n label=\"Experiment\"\n size=\"small\"\n variant=\"outlined\"\n sx={{\n fontSize: \"0.875rem\",\n color: \"common.white\",\n borderColor: \"rgba(255,255,255,0.5)\",\n }}\n />\n </Stack>\n <IconButton\n aria-label=\"close\"\n onClick={handleClose}\n sx={{\n position: \"absolute\",\n right: 8,\n top: 4,\n color: \"common.white\",\n }}\n >\n <IoClose />\n </IconButton>\n </Box>\n <DialogContent sx={{ p: 0 }}>\n <VSplit\n sizes={isRunResultOpen ? [50, 50] : [100, 0]}\n minSize={isRunResultOpen ? 100 : 0}\n gutterSize={isRunResultOpen ? 5 : 0}\n style={{\n flex: \"1\",\n contain: \"size\",\n height: \"100%\",\n }}\n >\n <Stack sx={{ height: \"100%\", m: 0, p: 0 }}>\n <SandboxTopBar\n current={current}\n primaryKeys={primaryKeys}\n onPrimaryKeysChange={handlePrimaryKeysChange}\n onRunResultOpen={handleRunResultOpen}\n runQuery={handleRunQuery}\n isPending={isPending}\n QueryForm={QueryForm}\n />\n <SandboxEditorLabels\n height=\"32px\"\n flex=\"0 0 auto\"\n currentModelID={current?.id ?? \"\"}\n isDark={isDark}\n />\n <SqlPreview\n current={current}\n onChange={handleModifiedCodeChange}\n isDark={isDark}\n DiffEditor={DiffEditor}\n />\n </Stack>\n {isRunResultOpen ? (\n <RunResultPane\n onClose={() => setIsRunResultOpen(false)}\n disableAddToChecklist\n />\n ) : (\n <Box />\n )}\n </VSplit>\n </DialogContent>\n {/* Fixed position button */}\n <Box sx={{ position: \"fixed\", bottom: 16, right: 16, opacity: 0.5 }}>\n <MuiTooltip title=\"Give us feedback\">\n <IconButton\n aria-label=\"feedback\"\n size=\"medium\"\n onClick={() => {\n onShowFeedback?.();\n }}\n >\n <VscFeedback />\n </IconButton>\n </MuiTooltip>\n </Box>\n </MuiDialog>\n );\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { useState } from \"react\";\nimport {\n LOCAL_STORAGE_KEYS,\n type QueryParams,\n type SubmitOptions,\n submitQueryDiff,\n waitRun,\n} from \"../../api\";\nimport { useRecceActionContext, useRecceServerFlag } from \"../../contexts\";\nimport {\n useApiConfig,\n useFeedbackCollectionToast,\n useGuideToast,\n useIsDark,\n useRecceQueryContext,\n} from \"../../hooks\";\nimport {\n trackPreviewChange,\n trackPreviewChangeFeedback,\n trackSingleEnvironment,\n} from \"../../lib/api/track\";\nimport { DiffEditor } from \"../../primitives\";\nimport { QueryForm } from \"../query\";\nimport { RunResultPaneOss as RunResultPane } from \"../run\";\nimport {\n SandboxView as BaseSandboxView,\n type SandboxNodeData,\n} from \"./SandboxView\";\n\ninterface SandboxViewProps {\n isOpen: boolean;\n onClose: () => void;\n current?: SandboxNodeData;\n height?: string;\n}\n\n/**\n * OSS wrapper for SandboxView that injects OSS-specific implementations.\n *\n * This wrapper:\n * 1. Handles query execution with React Query mutations\n * 2. Injects OSS-specific components (DiffEditor, QueryForm, RunResultPane)\n * 3. Provides OSS-specific tracking and feedback toasts\n * 4. Manages run state via useRecceActionContext\n *\n * The underlying BaseSandboxView from @datarecce/ui is framework-agnostic\n * and accepts components as props for dependency injection.\n */\nexport function SandboxViewOss({ isOpen, onClose, current }: SandboxViewProps) {\n const [modifiedCode, setModifiedCode] = useState<string>(\n current?.raw_code ?? \"\",\n );\n const [prevIsOpen, setPrevIsOpen] = useState(isOpen);\n const { showRunId, clearRunResult } = useRecceActionContext();\n const { primaryKeys, setPrimaryKeys } = useRecceQueryContext();\n const { data: flags, isLoading } = useRecceServerFlag();\n const { apiClient } = useApiConfig();\n const isDark = useIsDark();\n\n // Reset modifiedCode when modal opens\n if (isOpen !== prevIsOpen) {\n setPrevIsOpen(isOpen);\n if (isOpen) {\n setModifiedCode(current?.raw_code ?? \"\");\n }\n }\n\n const queryFn = async () => {\n const sqlTemplate = modifiedCode;\n const runFn = submitQueryDiff;\n const params: QueryParams = {\n current_model: current?.name ?? \"\",\n primary_keys: primaryKeys,\n sql_template: sqlTemplate,\n };\n const options: SubmitOptions = { nowait: true };\n\n const { run_id } = await runFn(params, options, apiClient);\n\n showRunId(run_id);\n\n return await waitRun(run_id, undefined, apiClient);\n };\n\n const { mutate: runQuery, isPending } = useMutation({\n mutationFn: queryFn,\n onSuccess(data) {\n if (data.error) {\n trackPreviewChange({\n action: \"run\",\n node: current?.name,\n status: \"failure\",\n });\n } else {\n trackPreviewChange({\n action: \"run\",\n node: current?.name,\n status: \"success\",\n });\n setTimeout(() => {\n feedbackToast();\n }, 1000);\n if (!isLoading && flags?.single_env_onboarding) {\n setTimeout(() => {\n prepareEnvToast();\n }, 2000);\n }\n }\n },\n });\n\n const { feedbackToast, closeToast } = useFeedbackCollectionToast({\n feedbackId: LOCAL_STORAGE_KEYS.previewChangeFeedbackID,\n description: \"Enjoy preview change?\",\n\n onFeedbackSubmit: (feedback: string) => {\n switch (feedback) {\n case \"like\":\n trackPreviewChangeFeedback({ feedback: \"like\", node: current?.name });\n break;\n case \"dislike\":\n trackPreviewChangeFeedback({\n feedback: \"dislike\",\n node: current?.name,\n });\n break;\n case \"link\":\n trackPreviewChangeFeedback({ feedback: \"form\", node: current?.name });\n break;\n default:\n console.log(\"Not support feedback type\");\n }\n },\n externalLink:\n \"https://docs.google.com/forms/d/e/1FAIpQLSd7Lei7Ijwo7MinWaI0K6rzZi_21gV1BKetmiNEX254kDziDA/viewform?usp=header\",\n externalLinkText: \"Give us feedback\",\n });\n\n const { guideToast: prepareEnvToast, closeGuideToast } = useGuideToast({\n guideId: LOCAL_STORAGE_KEYS.prepareEnvGuideID,\n description: \"Want to compare data changes with production data?\",\n externalLink:\n \"https://docs.datarecce.io/get-started/#prepare-dbt-artifacts\",\n externalLinkText: \"Learn how.\",\n onExternalLinkClick: () => {\n trackSingleEnvironment({\n action: \"external_link\",\n from: \"preview_changes\",\n node: current?.name,\n });\n },\n });\n\n const handleClose = () => {\n onClose();\n clearRunResult();\n closeToast();\n closeGuideToast();\n };\n\n return (\n <BaseSandboxView\n isOpen={isOpen}\n onClose={handleClose}\n current={current}\n DiffEditor={DiffEditor}\n QueryForm={QueryForm}\n RunResultPane={RunResultPane}\n isDark={isDark}\n primaryKeys={primaryKeys ?? []}\n onPrimaryKeysChange={setPrimaryKeys}\n isPending={isPending}\n onRunQuery={runQuery}\n onModifiedCodeChange={setModifiedCode}\n onShowFeedback={() => feedbackToast(true)}\n tracking={{\n onPreviewChange: trackPreviewChange,\n }}\n />\n );\n}\n","\"use client\";\n\n/**\n * @file NodeViewOss.tsx\n * @description wrapper for NodeView that injects dependencies.\n *\n * This wrapper:\n * 1. Provides OSS-specific schema view components\n * 2. Injects action callbacks that integrate with OSS contexts\n * 3. Provides run type icons from the OSS registry\n * 4. Handles navigation and tracking\n */\n\nimport Typography from \"@mui/material/Typography\";\nimport { useRouter } from \"next/navigation\";\nimport { useMemo } from \"react\";\nimport type { LineageGraphNode } from \"../..\";\nimport { createSchemaDiffCheck } from \"../../api\";\nimport {\n useLineageGraphContext,\n useRecceActionContext,\n useRecceInstanceContext,\n useRouteConfig,\n} from \"../../contexts\";\nimport {\n useApiConfig,\n useModelColumns,\n useRecceQueryContext,\n} from \"../../hooks\";\nimport {\n EXPLORE_ACTION,\n EXPLORE_SOURCE,\n trackExploreAction,\n trackPreviewChange,\n} from \"../../lib/api/track\";\nimport { formatSelectColumns } from \"../../utils\";\nimport { SetupConnectionPopover } from \"../app\";\nimport { LearnHowLink, RecceNotification } from \"../onboarding-guide\";\nimport { findByRunType } from \"../run\";\nimport { SchemaView, SingleEnvSchemaView } from \"../schema\";\nimport { NodeSqlViewOss } from \"./NodeSqlViewOss\";\nimport { RowCountDiffTag, RowCountTag } from \"./NodeTag\";\nimport {\n NodeView as BaseNodeView,\n type NodeViewActionCallbacks,\n type RunTypeIconMap,\n} from \"./NodeView\";\nimport { SandboxViewOss } from \"./SandboxViewOss\";\nimport { ResourceTypeTag as ResourceTypeTagBase } from \"./tags\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\ninterface NodeViewProps {\n node: LineageGraphNode;\n onCloseNode: () => void;\n}\n\nconst ResourceTypeTag = ({ node }: { node: LineageGraphNode }) => (\n <ResourceTypeTagBase data={{ resourceType: node.data.resourceType }} />\n);\n\n// =============================================================================\n// OSS-SPECIFIC WRAPPER COMPONENTS\n// =============================================================================\n\n/**\n * Notification component that includes the LearnHowLink.\n */\nfunction OssNotificationComponent({ onClose }: { onClose: () => void }) {\n return (\n <RecceNotification onClose={onClose} align=\"flex-start\">\n <Typography variant=\"body2\">\n Enable the Recce Checklist and start adding checks for better data\n validation and review.\n <br />\n <LearnHowLink />\n </Typography>\n </RecceNotification>\n );\n}\n\n// =============================================================================\n// MAIN COMPONENT\n// =============================================================================\n\n/**\n * OSS wrapper for NodeView that injects OSS-specific dependencies.\n *\n * This wrapper provides:\n * - OSS-specific schema view components\n * - Action callbacks that integrate with OSS contexts (tracking, navigation)\n * - Run type icons from the OSS registry\n * - Connection popover wrapper for database setup prompts\n * - Sandbox dialog component\n */\nexport function NodeViewOss({ node, onCloseNode }: NodeViewProps) {\n const router = useRouter();\n const { runAction } = useRecceActionContext();\n const { isActionAvailable, envInfo } = useLineageGraphContext();\n const { singleEnv: isSingleEnvOnboarding, featureToggles } =\n useRecceInstanceContext();\n const { setSqlQuery, setPrimaryKeys } = useRecceQueryContext();\n const { primaryKey } = useModelColumns(node.data.name);\n const { apiClient } = useApiConfig();\n const { basePath } = useRouteConfig();\n\n // Build run type icons map from OSS registry\n const runTypeIcons: RunTypeIconMap = useMemo(\n () => ({\n query: findByRunType(\"query\").icon,\n row_count: findByRunType(\"row_count\").icon,\n row_count_diff: findByRunType(\"row_count_diff\").icon,\n profile: findByRunType(\"profile\").icon,\n profile_diff: findByRunType(\"profile_diff\").icon,\n query_diff: findByRunType(\"query_diff\").icon,\n value_diff: findByRunType(\"value_diff\").icon,\n top_k_diff: findByRunType(\"top_k_diff\").icon,\n histogram_diff: findByRunType(\"histogram_diff\").icon,\n schema_diff: findByRunType(\"schema_diff\").icon,\n sandbox: findByRunType(\"sandbox\").icon,\n }),\n [],\n );\n\n // Build query string for this node\n const baseColumns = Object.keys(node.data.data.base?.columns ?? {});\n const currentColumns = Object.keys(node.data.data.current?.columns ?? {});\n const formattedColumns = formatSelectColumns(baseColumns, currentColumns);\n const query = useMemo(() => {\n if (formattedColumns.length) {\n return `select \\n ${formattedColumns.join(\"\\n \")}\\nfrom {{ ref(\"${node.data.name}\") }}`;\n }\n return `select * from {{ ref(\"${node.data.name}\") }}`;\n }, [formattedColumns, node.data.name]);\n\n // Action callbacks for the base component\n const actionCallbacks: NodeViewActionCallbacks = useMemo(\n () => ({\n onQueryClick: () => {\n if (envInfo?.adapterType === \"dbt\") {\n setSqlQuery(query);\n } else if (envInfo?.adapterType === \"sqlmesh\") {\n setSqlQuery(`select * from ${node.data.name}`);\n }\n router.push(`${basePath}/query`);\n },\n\n onRowCountClick: () => {\n trackExploreAction({\n action: EXPLORE_ACTION.ROW_COUNT,\n source: EXPLORE_SOURCE.SCHEMA_ROW_COUNT_BUTTON,\n node_count: 1,\n });\n runAction(\n \"row_count\",\n { node_names: [node.data.name] },\n { showForm: false, showLast: false },\n );\n },\n\n onRowCountDiffClick: () => {\n trackExploreAction({\n action: EXPLORE_ACTION.ROW_COUNT_DIFF,\n source: EXPLORE_SOURCE.SCHEMA_ROW_COUNT_BUTTON,\n node_count: 1,\n });\n runAction(\n \"row_count_diff\",\n { node_names: [node.data.name] },\n { showForm: false, showLast: false },\n );\n },\n\n onProfileClick: () => {\n trackExploreAction({\n action: EXPLORE_ACTION.PROFILE,\n source: EXPLORE_SOURCE.NODE_SIDEBAR_SINGLE_ENV,\n node_count: 1,\n });\n runAction(\n \"profile\",\n { model: node.data.name },\n { showForm: true, showLast: false },\n );\n },\n\n onProfileDiffClick: () => {\n trackExploreAction({\n action: EXPLORE_ACTION.PROFILE_DIFF,\n source: EXPLORE_SOURCE.NODE_SIDEBAR_MULTI_ENV,\n node_count: 1,\n });\n runAction(\n \"profile_diff\",\n { model: node.data.name },\n { showForm: true, showLast: false },\n );\n },\n\n onQueryDiffClick: () => {\n if (envInfo?.adapterType === \"dbt\") {\n setSqlQuery(query);\n } else if (envInfo?.adapterType === \"sqlmesh\") {\n setSqlQuery(`select * from ${node.data.name}`);\n }\n if (isActionAvailable(\"query_diff_with_primary_key\")) {\n setPrimaryKeys(primaryKey !== undefined ? [primaryKey] : undefined);\n }\n router.push(`${basePath}/query`);\n },\n\n onValueDiffClick: () => {\n trackExploreAction({\n action: EXPLORE_ACTION.VALUE_DIFF,\n source: EXPLORE_SOURCE.NODE_SIDEBAR_MULTI_ENV,\n node_count: 1,\n });\n runAction(\n \"value_diff\",\n { model: node.data.name },\n { showForm: true, showLast: false },\n );\n },\n\n onTopKDiffClick: () => {\n trackExploreAction({\n action: EXPLORE_ACTION.TOP_K_DIFF,\n source: EXPLORE_SOURCE.NODE_SIDEBAR_MULTI_ENV,\n node_count: 1,\n });\n runAction(\n \"top_k_diff\",\n { model: node.data.name, column_name: \"\", k: 50 },\n { showForm: true },\n );\n },\n\n onHistogramDiffClick: () => {\n trackExploreAction({\n action: EXPLORE_ACTION.HISTOGRAM_DIFF,\n source: EXPLORE_SOURCE.NODE_SIDEBAR_MULTI_ENV,\n node_count: 1,\n });\n runAction(\n \"histogram_diff\",\n { model: node.data.name, column_name: \"\", column_type: \"\" },\n { showForm: true },\n );\n },\n\n onAddSchemaDiffClick: async () => {\n const check = await createSchemaDiffCheck(\n { node_id: node.id },\n apiClient,\n );\n router.push(`${basePath}/checks/?id=${check.check_id}`);\n },\n\n onSandboxClick: () => {\n if (isActionAvailable(\"query_diff_with_primary_key\")) {\n setPrimaryKeys(primaryKey !== undefined ? [primaryKey] : undefined);\n }\n trackPreviewChange({\n action: \"explore\",\n node: node.data.name,\n });\n },\n }),\n [\n node,\n query,\n envInfo,\n setSqlQuery,\n runAction,\n isActionAvailable,\n setPrimaryKeys,\n primaryKey,\n apiClient,\n router.push,\n basePath,\n ],\n );\n\n return (\n <BaseNodeView\n node={node}\n onCloseNode={onCloseNode}\n isSingleEnv={isSingleEnvOnboarding ?? false}\n featureToggles={featureToggles}\n // Schema components\n SchemaView={SchemaView}\n SingleEnvSchemaView={SingleEnvSchemaView}\n NodeSqlView={NodeSqlViewOss}\n // Tag components\n ResourceTypeTag={ResourceTypeTag}\n RowCountDiffTag={RowCountDiffTag}\n RowCountTag={RowCountTag}\n // Notification for single env\n NotificationComponent={OssNotificationComponent}\n // Connection popover wrapper\n ConnectionPopoverWrapper={SetupConnectionPopover}\n // Sandbox dialog\n SandboxDialog={SandboxViewOss}\n // Icons\n runTypeIcons={runTypeIcons}\n // Callbacks\n actionCallbacks={actionCallbacks}\n isActionAvailable={isActionAvailable}\n />\n );\n}\n","\"use client\";\n\nimport Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { PiInfo } from \"react-icons/pi\";\n\nimport type { RecceFeatureToggles } from \"../../contexts/instance\";\n\n/**\n * Props for the SetupConnectionBanner component.\n *\n * Uses dependency injection for context dependencies to enable reuse\n * across different applications (OSS Recce, Recce Cloud).\n */\nexport interface SetupConnectionBannerProps {\n /**\n * Feature toggles from RecceInstanceContext.\n * Used to determine if banner should be shown (metadata only mode).\n */\n featureToggles: RecceFeatureToggles;\n\n /**\n * URL to open when user clicks \"Connect to Data Warehouse\" button.\n * Injected because URL generation varies by application context.\n */\n settingsUrl: string;\n}\n\n/**\n * Banner component that prompts users to set up a data warehouse connection.\n *\n * Displays when the Recce instance is in \"metadata only\" mode, indicating\n * that query functions are disabled without a data warehouse connection.\n *\n * @example\n * ```tsx\n * import { SetupConnectionBanner } from \"@datarecce/ui\";\n *\n * function MyComponent() {\n * const { featureToggles } = useRecceInstanceContext();\n * const { data: instanceInfo } = useRecceInstanceInfo();\n * const settingsUrl = getSettingsUrl(instanceInfo);\n *\n * return (\n * <SetupConnectionBanner\n * featureToggles={featureToggles}\n * settingsUrl={settingsUrl}\n * />\n * );\n * }\n * ```\n */\nexport function SetupConnectionBanner({\n featureToggles,\n settingsUrl,\n}: SetupConnectionBannerProps) {\n if (featureToggles.mode !== \"metadata only\") {\n return null;\n }\n\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n width: \"100%\",\n px: 1,\n py: 0.25,\n bgcolor: \"cyan.50\",\n }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n sx={{ flex: 1, fontSize: \"0.875rem\", color: \"cyan.600\" }}\n spacing={1}\n >\n <Box component={PiInfo} />\n <Typography sx={{ fontSize: \"inherit\", color: \"inherit\" }}>\n Query functions disabled without a data warehouse connection.\n </Typography>\n <Button\n sx={{ bgcolor: \"iochmara.400\" }}\n size=\"small\"\n variant=\"contained\"\n onClick={() => {\n window.open(settingsUrl, \"_blank\");\n }}\n >\n Connect to Data Warehouse\n </Button>\n </Stack>\n </Box>\n );\n}\n\nexport default SetupConnectionBanner;\n","\"use client\";\n\nimport { useRecceInstanceContext, useRecceInstanceInfo } from \"../../contexts\";\nimport { RECCE_SUPPORT_CALENDAR_URL } from \"../../lib/const\";\nimport { getSettingsUrl } from \"../../utils\";\nimport {\n SetupConnectionBanner as BaseSetupConnectionBanner,\n type SetupConnectionBannerProps as BaseSetupConnectionBannerProps,\n} from \"./SetupConnectionBanner\";\n\n/**\n * Props for the OSS SetupConnectionBanner wrapper.\n * Extends the base props but makes injected dependencies optional\n * since they're provided by OSS-specific contexts.\n */\nexport type SetupConnectionBannerOssProps =\n Partial<BaseSetupConnectionBannerProps>;\n\n/**\n * OSS wrapper for SetupConnectionBanner.\n *\n * Provides OSS-specific context integration by automatically:\n * - Fetching feature toggles from RecceInstanceContext\n * - Generating settings URL from instance info\n */\nexport default function SetupConnectionBannerOss(\n props: SetupConnectionBannerOssProps,\n) {\n const { featureToggles } = useRecceInstanceContext();\n const { data: instanceInfo } = useRecceInstanceInfo();\n\n return (\n <BaseSetupConnectionBanner\n featureToggles={props.featureToggles ?? featureToggles}\n settingsUrl={\n props.settingsUrl ??\n getSettingsUrl(instanceInfo, RECCE_SUPPORT_CALENDAR_URL)\n }\n />\n );\n}\n","\"use client\";\n\nimport Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Link from \"@mui/material/Link\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { RiMindMap, RiTerminalBoxLine } from \"react-icons/ri\";\n\n// =============================================================================\n// TYPE DEFINITIONS\n// =============================================================================\n\n/**\n * Props for BaseEnvironmentSetupGuide component.\n * Uses dependency injection for external URLs to support different consumers.\n */\nexport interface BaseEnvironmentSetupGuideProps {\n /**\n * URL to navigate to when \"Start Now\" button is clicked.\n * @default \"https://docs.datarecce.io/get-started/#prepare-dbt-artifacts\"\n */\n docsUrl?: string;\n /**\n * Callback when the \"Start Now\" button is clicked.\n * If provided, will be called instead of opening the URL.\n */\n onStartClick?: () => void;\n}\n\n/**\n * Props for BaseEnvironmentSetupNotification component.\n * Uses dependency injection for external URLs to support different consumers.\n */\nexport interface BaseEnvironmentSetupNotificationProps {\n /**\n * URL for the documentation link.\n * @default \"https://docs.datarecce.io/configure-diff/\"\n */\n docsUrl?: string;\n}\n\n// =============================================================================\n// COMPONENTS\n// =============================================================================\n\n/**\n * BaseEnvironmentSetupGuide Component\n *\n * Full-page guide displayed when Recce is running in single environment mode\n * (limited functionality mode). Explains the benefits of setting up a base\n * environment and provides a call-to-action to configure it.\n *\n * @example\n * ```tsx\n * import { BaseEnvironmentSetupGuide } from '@datarecce/ui/components/lineage';\n *\n * // Default usage with standard docs URL\n * <BaseEnvironmentSetupGuide />\n *\n * // Custom docs URL for different consumer\n * <BaseEnvironmentSetupGuide\n * docsUrl=\"https://cloud.datarecce.io/docs/setup\"\n * />\n *\n * // Custom click handler\n * <BaseEnvironmentSetupGuide\n * onStartClick={() => navigateToSetup()}\n * />\n * ```\n */\nexport function BaseEnvironmentSetupGuide({\n docsUrl = \"https://docs.datarecce.io/get-started/#prepare-dbt-artifacts\",\n onStartClick,\n}: BaseEnvironmentSetupGuideProps = {}) {\n const handleStartClick = () => {\n if (onStartClick) {\n onStartClick();\n } else {\n window.open(docsUrl, \"_blank\");\n }\n };\n\n return (\n <Stack\n sx={{\n flex: 1,\n height: \"100%\",\n minHeight: 0,\n m: 1,\n p: 2,\n bgcolor: \"iochmara.50\",\n borderRadius: 2,\n boxShadow: 2,\n justifyContent: \"center\",\n }}\n >\n <Stack\n sx={{ width: \"80%\", overflowY: \"auto\", gap: 3, px: 4, pb: 4 }}\n alignSelf=\"center\"\n >\n <Stack alignItems=\"center\" spacing={2}>\n <Box\n sx={{\n p: 1,\n bgcolor: \"background.paper\",\n borderRadius: \"50%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n boxShadow: 2,\n }}\n >\n <Box\n component={RiTerminalBoxLine}\n sx={{ fontSize: 28, color: \"iochmara.500\" }}\n />\n </Box>\n <Typography variant=\"h5\" sx={{ mt: 2 }}>\n Wait, there's more!\n </Typography>\n <Typography sx={{ textAlign: \"center\" }}>\n Recce is currently running in{\" \"}\n <Typography component=\"span\" sx={{ fontWeight: \"bold\" }}>\n limited functionality mode\n </Typography>{\" \"}\n so you can run queries but{\" \"}\n <Typography component=\"span\" sx={{ fontWeight: \"bold\" }}>\n can't diff the results yet!\n </Typography>\n </Typography>\n </Stack>\n <Stack spacing={1}>\n <Typography>\n To unlock the full power of Recce, set up a base environment of dbt\n artifacts for comparison.\n </Typography>\n <Typography>Once configured, you'll be able to:</Typography>\n <List sx={{ listStyleType: \"disc\", pl: 2 }}>\n <ListItem sx={{ display: \"list-item\", p: 0 }}>\n <Typography>Run statistical data diffs</Typography>\n </ListItem>\n <ListItem sx={{ display: \"list-item\", p: 0 }}>\n <Typography>Run query diffs</Typography>\n </ListItem>\n <ListItem sx={{ display: \"list-item\", p: 0 }}>\n <Typography>Save checks to your Recce Checklist</Typography>\n </ListItem>\n <ListItem sx={{ display: \"list-item\", p: 0 }}>\n <Typography>...and more!</Typography>\n </ListItem>\n </List>\n <Typography>\n Take the next step toward better data impact assessment.\n </Typography>\n </Stack>\n <Stack sx={{ width: \"100%\", mt: 3 }}>\n <Button\n color=\"iochmara\"\n variant=\"contained\"\n size=\"large\"\n onClick={handleStartClick}\n >\n Start Now\n </Button>\n </Stack>\n </Stack>\n </Stack>\n );\n}\n\n/**\n * BaseEnvironmentSetupNotification Component\n *\n * Compact notification/banner component displayed in the lineage view sidebar\n * when in single environment mode. Provides quick guidance on how to set up\n * full environment comparison.\n *\n * @example\n * ```tsx\n * import { BaseEnvironmentSetupNotification } from '@datarecce/ui/components/lineage';\n *\n * // Default usage with standard docs URL\n * <BaseEnvironmentSetupNotification />\n *\n * // Custom docs URL for different consumer\n * <BaseEnvironmentSetupNotification\n * docsUrl=\"https://cloud.datarecce.io/docs/configure\"\n * />\n * ```\n */\nexport function BaseEnvironmentSetupNotification({\n docsUrl = \"https://docs.datarecce.io/configure-diff/\",\n}: BaseEnvironmentSetupNotificationProps = {}) {\n return (\n <Stack direction=\"row\" spacing=\"10px\" alignItems=\"flex-start\">\n <Box\n component={RiMindMap}\n sx={{ color: \"iochmara.main\", fontSize: 20 }}\n />\n <Stack spacing=\"5px\">\n <Typography sx={{ fontWeight: 700 }}>\n Single Environment Mode{\" \"}\n <Typography\n component=\"span\"\n sx={{ color: \"error.main\", fontWeight: 600 }}\n >\n Limited Functionality\n </Typography>\n </Typography>\n\n <Typography sx={{ fontSize: \"0.875rem\" }}>\n Single Environment Mode allows you to explore your dbt project but\n won't show data comparisons between environments.\n </Typography>\n <Typography sx={{ fontSize: \"0.875rem\" }}>\n To set up full environment comparison:\n </Typography>\n <List sx={{ pl: 2 }}>\n <ListItem sx={{ p: 0, display: \"list-item\" }}>\n <Typography sx={{ fontSize: \"0.875rem\" }}>\n Run `recce debug` for setup assistance\n </Typography>\n </ListItem>\n <ListItem sx={{ p: 0, display: \"list-item\" }}>\n <Typography sx={{ fontSize: \"0.875rem\" }}>\n Visit{\" \"}\n <Link\n sx={{ color: \"primary.main\", fontWeight: 500 }}\n target=\"_blank\"\n href={docsUrl}\n >\n docs\n </Link>{\" \"}\n for configuration details\n </Typography>\n </ListItem>\n </List>\n </Stack>\n </Stack>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport Stack from \"@mui/material/Stack\";\nimport type { LineageDiffViewOptions } from \"../../../api\";\n\n/**\n * Loading state component for LineageView.\n * Displays a centered spinner while lineage data is loading.\n */\nexport function LineageViewLoading() {\n return (\n <Box\n sx={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <CircularProgress size={48} />\n </Box>\n );\n}\n\n/**\n * Props for LineageViewError component.\n */\nexport interface LineageViewErrorProps {\n /** The error message to display */\n error: string;\n /** Callback to retry loading the lineage data */\n onRetry?: () => void;\n}\n\n/**\n * Error state component for LineageView.\n * Displays error message with a retry button.\n */\nexport function LineageViewError({ error, onRetry }: LineageViewErrorProps) {\n return (\n <Box\n sx={{\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <Stack alignItems=\"center\" spacing={1}>\n <Box>\n Failed to load lineage data. This could be because the server has been\n terminated or there is a network error.\n </Box>\n <Box>[Reason: {error}]</Box>\n <Button\n color=\"iochmara\"\n variant=\"contained\"\n onClick={() => {\n if (onRetry) {\n onRetry();\n }\n }}\n >\n Retry\n </Button>\n </Stack>\n </Box>\n );\n}\n\n/**\n * Props for LineageViewNoChanges component.\n */\nexport interface LineageViewNoChangesProps {\n /** Current view options */\n viewOptions: LineageDiffViewOptions;\n /** Callback to change view options */\n onViewOptionsChanged: (options: LineageDiffViewOptions) => void;\n}\n\n/**\n * Empty state component when no changes are detected in changed_models view mode.\n * Provides a button to switch to \"all\" view mode.\n */\nexport function LineageViewNoChanges({\n viewOptions,\n onViewOptionsChanged,\n}: LineageViewNoChangesProps) {\n return (\n <Box\n sx={{\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <Stack alignItems=\"center\" spacing={1}>\n <>No change detected</>\n <Button\n color=\"iochmara\"\n variant=\"contained\"\n onClick={async () => {\n await onViewOptionsChanged({\n ...viewOptions,\n view_mode: \"all\",\n });\n }}\n >\n Show all nodes\n </Button>\n </Stack>\n </Box>\n );\n}\n","\"use client\";\n\nimport Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport type { ReactNode } from \"react\";\nimport { VscHistory } from \"react-icons/vsc\";\nimport { useRecceActionContext } from \"../../contexts\";\nimport { trackHistoryAction } from \"../../lib/api/track\";\n\nexport function HistoryToggle(): ReactNode {\n const { isHistoryOpen, showHistory } = useRecceActionContext();\n\n if (isHistoryOpen) {\n return;\n }\n\n return (\n <Box>\n <Box sx={{ fontSize: \"8pt\" }}>History</Box>\n\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<VscHistory />}\n onClick={() => {\n trackHistoryAction({ name: isHistoryOpen ? \"hide\" : \"show\" });\n showHistory();\n }}\n >\n Show\n </Button>\n </Box>\n );\n}\n","\"use client\";\n\n/**\n * @file LineageViewTopBar.tsx\n * @description Core LineageViewTopBar component with dependency injection.\n *\n * This component provides the top toolbar for the lineage view with filtering,\n * mode selection, package filtering, and action menus. It uses dependency injection\n * for consumer-specific features like routing, tracking, and run type icons.\n *\n * @example\n * ```tsx\n * import { LineageViewTopBar } from '@datarecce/ui/components/lineage';\n *\n * <LineageViewTopBar\n * viewOptions={viewOptions}\n * onViewOptionsChanged={handleViewOptionsChanged}\n * lineageGraph={lineageGraph}\n * featureToggles={featureToggles}\n * serverFlags={serverFlags}\n * selectedNodes={selectedNodes}\n * focusedNode={focusedNode}\n * onDeselect={handleDeselect}\n * onRunRowCount={handleRunRowCount}\n * onRunRowCountDiff={handleRunRowCountDiff}\n * onRunValueDiff={handleRunValueDiff}\n * onAddLineageDiffCheck={handleAddLineageDiffCheck}\n * onAddSchemaDiffCheck={handleAddSchemaDiffCheck}\n * runTypeIcons={runTypeIcons}\n * historyToggleSlot={<HistoryToggle />}\n * setupConnectionPopoverSlot={SetupConnectionPopover}\n * />\n * ```\n */\n\nimport Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Checkbox from \"@mui/material/Checkbox\";\nimport Divider from \"@mui/material/Divider\";\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport ListSubheader from \"@mui/material/ListSubheader\";\nimport Menu from \"@mui/material/Menu\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport Radio from \"@mui/material/Radio\";\nimport RadioGroup from \"@mui/material/RadioGroup\";\nimport Stack from \"@mui/material/Stack\";\nimport TextField from \"@mui/material/TextField\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport {\n type ComponentType,\n type CSSProperties,\n type MouseEvent,\n type ReactNode,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { FiPackage } from \"react-icons/fi\";\nimport { PiCaretDown } from \"react-icons/pi\";\nimport type { RecceServerFlags } from \"../../../api/flag\";\nimport type { LineageDiffViewOptions } from \"../../../api/lineagecheck\";\nimport type { RecceFeatureToggles } from \"../../../contexts/instance/types\";\nimport type {\n LineageGraph,\n LineageGraphNode,\n} from \"../../../contexts/lineage/types\";\nimport { useIsDark } from \"../../../hooks/useIsDark\";\nimport type { IconComponent } from \"../../run/types\";\nimport { getIconForResourceType } from \"../styles\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Icons for run types used in action menus.\n * Consumers inject their own icons based on their run type registry.\n */\nexport interface RunTypeIcons {\n /** Icon for row_count_diff action */\n rowCountDiff: IconComponent;\n /** Icon for value_diff action */\n valueDiff: IconComponent;\n /** Icon for lineage_diff action */\n lineageDiff: IconComponent;\n /** Icon for schema_diff action */\n schemaDiff: IconComponent;\n}\n\n/**\n * Props for the SetupConnectionPopover slot component.\n */\nexport interface SetupConnectionPopoverSlotProps {\n /** Whether to display the popover */\n display: boolean;\n /** Child element to wrap */\n children: ReactNode;\n}\n\n/**\n * Props for the LineageViewTopBar component.\n */\nexport interface LineageViewTopBarProps {\n // View options and state\n /** Current view options for filtering and display mode */\n viewOptions: LineageDiffViewOptions;\n /** Callback when view options change */\n onViewOptionsChanged: (options: LineageDiffViewOptions) => void;\n /** The lineage graph data */\n lineageGraph?: LineageGraph;\n /** Feature toggles controlling what is enabled */\n featureToggles: RecceFeatureToggles;\n /** Server-side feature flags */\n serverFlags?: RecceServerFlags;\n\n // Selection state\n /** Currently focused node (hovered/highlighted) */\n focusedNode?: LineageGraphNode;\n /** Currently selected nodes for batch operations */\n selectedNodes: LineageGraphNode[];\n /** Callback to clear selection */\n onDeselect: () => void;\n\n // Action callbacks\n /** Callback for running row count (single env mode) */\n onRunRowCount?: () => Promise<void>;\n /** Callback for running row count diff */\n onRunRowCountDiff?: () => Promise<void>;\n /** Callback for running value diff */\n onRunValueDiff?: () => Promise<void>;\n /** Callback for adding a lineage diff check */\n onAddLineageDiffCheck?: (\n viewMode?: LineageDiffViewOptions[\"view_mode\"],\n ) => void;\n /** Callback for adding a schema diff check */\n onAddSchemaDiffCheck?: () => void;\n\n // Dependency injection slots\n /** Icons for run types in action menus */\n runTypeIcons: RunTypeIcons;\n /** Slot for history toggle component */\n historyToggleSlot?: ReactNode;\n /** Component for setup connection popover wrapper */\n SetupConnectionPopoverSlot?: ComponentType<SetupConnectionPopoverSlotProps>;\n}\n\n// ============================================================================\n// Internal Components\n// ============================================================================\n\nconst getCodeBlockSx = (isDark: boolean) => ({\n fontSize: \"8pt\",\n bgcolor: isDark ? \"grey.700\" : \"grey.100\",\n px: 0.5,\n borderRadius: 1,\n});\n\nconst SelectFilterTooltip = () => {\n const isDark = useIsDark();\n const codeBlockSx = getCodeBlockSx(isDark);\n return (\n <Stack alignItems=\"flex-start\" spacing={0}>\n <Typography fontSize=\"10pt\" color=\"text.secondary\" pb={1}>\n Select nodes by dbt node selector syntax\n </Typography>\n <Typography fontSize=\"8pt\">\n <Box component=\"code\" sx={codeBlockSx}>\n model_name\n </Box>{\" \"}\n Select a node\n </Typography>\n <Typography fontSize=\"8pt\">\n <Box component=\"code\" sx={codeBlockSx}>\n model_name+\n </Box>{\" \"}\n Select downstream nodes\n </Typography>\n <Typography fontSize=\"8pt\">\n <Box component=\"code\" sx={codeBlockSx}>\n +model_name\n </Box>{\" \"}\n Select upstream nodes\n </Typography>\n <Typography fontSize=\"8pt\">\n <Box component=\"code\" sx={codeBlockSx}>\n model*\n </Box>{\" \"}\n Select by wildcard\n </Typography>\n </Stack>\n );\n};\n\ninterface ViewModeSelectMenuProps {\n isDisabled: boolean;\n viewOptions: LineageDiffViewOptions;\n onViewOptionsChanged: (options: LineageDiffViewOptions) => void;\n}\n\nconst ViewModeSelectMenu = ({\n isDisabled,\n viewOptions,\n onViewOptionsChanged,\n}: ViewModeSelectMenuProps) => {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n\n const viewMode = viewOptions.view_mode ?? \"changed_models\";\n const label = viewMode === \"changed_models\" ? \"Changed Models\" : \"All\";\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const handleSelect = (newViewMode: LineageDiffViewOptions[\"view_mode\"]) => {\n onViewOptionsChanged({\n ...viewOptions,\n view_mode: newViewMode,\n });\n handleClose();\n };\n\n const ModelIcon = getIconForResourceType(\"model\").icon;\n\n return (\n <>\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n onClick={handleClick}\n disabled={isDisabled}\n startIcon={ModelIcon && <ModelIcon />}\n endIcon={<PiCaretDown />}\n sx={{ minWidth: 100, textTransform: \"none\", fontSize: \"0.75rem\" }}\n >\n {label}\n </Button>\n <Menu anchorEl={anchorEl} open={open} onClose={handleClose}>\n <ListSubheader sx={{ lineHeight: \"32px\", bgcolor: \"transparent\" }}>\n mode\n </ListSubheader>\n <RadioGroup value={viewMode}>\n <MenuItem onClick={() => handleSelect(\"changed_models\")}>\n <FormControlLabel\n value=\"changed_models\"\n control={<Radio size=\"small\" sx={{ py: 0 }} />}\n label=\"Changed Models\"\n sx={{ m: 0 }}\n />\n </MenuItem>\n <MenuItem onClick={() => handleSelect(\"all\")}>\n <FormControlLabel\n value=\"all\"\n control={<Radio size=\"small\" sx={{ py: 0 }} />}\n label=\"All\"\n sx={{ m: 0 }}\n />\n </MenuItem>\n </RadioGroup>\n </Menu>\n </>\n );\n};\n\ninterface PackageSelectMenuProps {\n isDisabled: boolean;\n viewOptions: LineageDiffViewOptions;\n onViewOptionsChanged: (options: LineageDiffViewOptions) => void;\n lineageGraph?: LineageGraph;\n}\n\nconst PackageSelectMenu = ({\n isDisabled,\n viewOptions,\n onViewOptionsChanged,\n lineageGraph,\n}: PackageSelectMenuProps) => {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n\n // get unique package names\n const available = new Set<string>();\n const nodes = Object.values(lineageGraph?.nodes ?? {});\n for (const node of nodes) {\n if (node.data.packageName) {\n available.add(node.data.packageName);\n }\n }\n\n const projectName = lineageGraph?.manifestMetadata.current?.project_name;\n\n const selected = viewOptions.packages\n ? new Set(viewOptions.packages)\n : projectName\n ? new Set([projectName])\n : available;\n const isSelectAll = selected.size === available.size;\n const isSelectNone = selected.size === 0;\n const label =\n selected.size === 1\n ? Array.from(selected)[0]\n : isSelectAll\n ? \"All Packages\"\n : isSelectNone\n ? \"No Package\"\n : `${selected.size} Packages`;\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const handleSelectAll = () => {\n if (isSelectAll) {\n onViewOptionsChanged({\n ...viewOptions,\n packages: [],\n });\n } else {\n onViewOptionsChanged({\n ...viewOptions,\n packages: Array.from(available),\n });\n }\n };\n\n const handleSelect = (pkg: string) => {\n const newSelected = new Set(selected);\n if (newSelected.has(pkg)) {\n newSelected.delete(pkg);\n } else {\n newSelected.add(pkg);\n }\n onViewOptionsChanged({\n ...viewOptions,\n packages: Array.from(newSelected),\n });\n };\n\n return (\n <>\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n onClick={handleClick}\n disabled={isDisabled}\n startIcon={<FiPackage />}\n endIcon={<PiCaretDown />}\n sx={{ minWidth: 100, textTransform: \"none\", fontSize: \"0.75rem\" }}\n >\n {label}\n </Button>\n <Menu anchorEl={anchorEl} open={open} onClose={handleClose}>\n <ListSubheader sx={{ lineHeight: \"32px\", bgcolor: \"transparent\" }}>\n Select Packages\n </ListSubheader>\n <MenuItem onClick={handleSelectAll}>\n <Checkbox\n checked={isSelectAll}\n indeterminate={!isSelectAll && !isSelectNone}\n size=\"small\"\n sx={{ py: 0 }}\n />\n <ListItemText>Select All</ListItemText>\n </MenuItem>\n\n <Divider />\n\n {Array.from(available).map((pkg) => (\n <MenuItem key={pkg} onClick={() => handleSelect(pkg)}>\n <Checkbox checked={selected.has(pkg)} size=\"small\" sx={{ py: 0 }} />\n <ListItemText className=\"no-track-pii-safe\">{pkg}</ListItemText>\n </MenuItem>\n ))}\n </Menu>\n </>\n );\n};\n\ninterface NodeSelectionInputProps {\n value: string;\n onChange: (value: string) => void;\n isDisabled?: boolean;\n tooltipComponent?: ReactNode;\n showTooltip?: boolean;\n}\n\nconst NodeSelectionInput = ({\n value,\n onChange,\n isDisabled,\n tooltipComponent,\n showTooltip = true,\n}: NodeSelectionInputProps) => {\n const [inputValue, setInputValue] = useState(value);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.value = value;\n }\n }, [value]);\n\n return (\n <MuiTooltip\n title={showTooltip ? tooltipComponent : \"\"}\n placement=\"bottom-start\"\n slotProps={{\n tooltip: {\n sx: {\n width: \"18.75rem\",\n p: 2,\n boxShadow: 3,\n border: 1,\n borderRadius: 1,\n color: \"text.primary\",\n bgcolor: \"background.paper\",\n },\n },\n }}\n >\n <TextField\n inputRef={inputRef}\n size=\"small\"\n placeholder=\"with selectors\"\n disabled={isDisabled}\n value={inputValue}\n onChange={(event) => {\n setInputValue(event.target.value);\n }}\n onKeyUp={(event) => {\n if (event.key === \"Enter\") {\n onChange(inputValue);\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n setInputValue(value);\n if (inputRef.current) {\n inputRef.current.blur();\n }\n }\n }}\n onBlur={() => {\n setInputValue(value);\n }}\n sx={{\n \"& .MuiInputBase-root\": {\n width: \"18.75rem\",\n height: 24,\n fontSize: \"0.75rem\",\n },\n \"& .MuiInputBase-input\": {\n py: 0.5,\n px: 1,\n },\n }}\n />\n </MuiTooltip>\n );\n};\n\ninterface SelectFilterProps {\n isDisabled: boolean;\n viewOptions: LineageDiffViewOptions;\n onViewOptionsChanged: (options: LineageDiffViewOptions) => void;\n showTooltip?: boolean;\n}\n\nconst SelectFilter = ({\n isDisabled,\n viewOptions,\n onViewOptionsChanged,\n showTooltip,\n}: SelectFilterProps) => {\n return (\n <NodeSelectionInput\n isDisabled={isDisabled}\n value={viewOptions.select ?? \"\"}\n onChange={(value) => {\n onViewOptionsChanged({\n ...viewOptions,\n select: value ? value : undefined,\n });\n }}\n tooltipComponent={<SelectFilterTooltip />}\n showTooltip={showTooltip}\n />\n );\n};\n\ninterface ExcludeFilterProps {\n isDisabled: boolean;\n viewOptions: LineageDiffViewOptions;\n onViewOptionsChanged: (options: LineageDiffViewOptions) => void;\n}\n\nconst ExcludeFilter = ({\n isDisabled,\n viewOptions,\n onViewOptionsChanged,\n}: ExcludeFilterProps) => {\n return (\n <NodeSelectionInput\n isDisabled={isDisabled}\n value={viewOptions.exclude ?? \"\"}\n onChange={(value) => {\n onViewOptionsChanged({\n ...viewOptions,\n exclude: value ? value : undefined,\n });\n }}\n />\n );\n};\n\ninterface ControlItemProps {\n label?: string;\n children: ReactNode;\n style?: CSSProperties;\n}\n\nconst ControlItem = ({ label, children, style }: ControlItemProps) => {\n return (\n <Box style={style} sx={{ maxWidth: 300 }}>\n <Typography fontSize=\"8pt\">\n {(label ?? \"\").trim() || <>&nbsp;</>}\n </Typography>\n {children}\n </Box>\n );\n};\n\n// ============================================================================\n// Default Setup Connection Popover (passthrough)\n// ============================================================================\n\nconst DefaultSetupConnectionPopover = ({\n children,\n}: SetupConnectionPopoverSlotProps) => {\n return <>{children}</>;\n};\n\n// ============================================================================\n// Main Component\n// ============================================================================\n\n/**\n * LineageViewTopBar Component\n *\n * Top toolbar for the lineage view providing:\n * - View mode selection (Changed Models vs All)\n * - Package filtering\n * - Node selector filters (Select, Exclude)\n * - Actions menu for diff operations and checklist additions\n * - Multi-node selection controls\n *\n * This component uses dependency injection for consumer-specific features\n * like history toggle, setup connection popover, and run type icons.\n */\nexport const LineageViewTopBar = ({\n viewOptions,\n onViewOptionsChanged,\n lineageGraph,\n featureToggles,\n serverFlags,\n focusedNode,\n selectedNodes,\n onDeselect,\n onRunRowCount,\n onRunRowCountDiff,\n onRunValueDiff,\n onAddLineageDiffCheck,\n onAddSchemaDiffCheck,\n runTypeIcons,\n historyToggleSlot,\n SetupConnectionPopoverSlot = DefaultSetupConnectionPopover,\n}: LineageViewTopBarProps) => {\n const isSingleEnvOnboarding = serverFlags?.single_env_onboarding;\n\n const [actionsAnchorEl, setActionsAnchorEl] = useState<HTMLElement | null>(\n null,\n );\n const actionsOpen = Boolean(actionsAnchorEl);\n\n const isSingleSelect = !!focusedNode;\n const isMultiSelect = selectedNodes.length > 0;\n const isNoSelect = !isSingleSelect && !isMultiSelect;\n const isFilterDisabled = isMultiSelect;\n\n const handleActionsClick = (event: MouseEvent<HTMLButtonElement>) => {\n setActionsAnchorEl(event.currentTarget);\n };\n\n const handleActionsClose = () => {\n setActionsAnchorEl(null);\n };\n\n // Get icons from dependency injection\n const RowCountDiffIcon = runTypeIcons.rowCountDiff;\n const ValueDiffIcon = runTypeIcons.valueDiff;\n const LineageDiffIcon = runTypeIcons.lineageDiff;\n const SchemaDiffIcon = runTypeIcons.schemaDiff;\n\n return (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n borderBottom={1}\n borderColor=\"neutral.light\"\n sx={{ width: \"100%\", p: \"4pt 8pt\", gap: \"0.5rem\" }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n sx={{ flex: 1, gap: \"0.5rem\" }}\n >\n {historyToggleSlot}\n <ControlItem label=\"Mode\" style={{ flexShrink: 1 }}>\n <ViewModeSelectMenu\n isDisabled={isFilterDisabled}\n viewOptions={viewOptions}\n onViewOptionsChanged={onViewOptionsChanged}\n />\n </ControlItem>\n <ControlItem label=\"Package\" style={{ flexShrink: 1 }}>\n <PackageSelectMenu\n isDisabled={isFilterDisabled}\n viewOptions={viewOptions}\n onViewOptionsChanged={onViewOptionsChanged}\n lineageGraph={lineageGraph}\n />\n </ControlItem>\n <ControlItem label=\"Select\" style={{ flexShrink: 1 }}>\n <SelectFilter\n isDisabled={isFilterDisabled}\n viewOptions={viewOptions}\n onViewOptionsChanged={onViewOptionsChanged}\n showTooltip={isSingleEnvOnboarding}\n />\n </ControlItem>\n <ControlItem label=\"Exclude\" style={{ flexShrink: 1 }}>\n <ExcludeFilter\n isDisabled={isFilterDisabled}\n viewOptions={viewOptions}\n onViewOptionsChanged={onViewOptionsChanged}\n />\n </ControlItem>\n <Box sx={{ flexGrow: 1 }} />\n {isMultiSelect && (\n <>\n <ControlItem label=\"\" style={{ flexShrink: 0 }}>\n <Typography fontSize=\"9pt\" color=\"text.secondary\">\n {selectedNodes.length > 1\n ? `${selectedNodes.length} nodes selected`\n : `${selectedNodes.length} node selected`}\n </Typography>\n </ControlItem>\n\n <ControlItem label=\"\">\n <Button\n variant=\"outlined\"\n color=\"neutral\"\n size=\"xsmall\"\n onClick={() => {\n onDeselect();\n }}\n sx={{ textTransform: \"none\", fontSize: \"9pt\" }}\n >\n Deselect\n </Button>\n </ControlItem>\n {isSingleEnvOnboarding && (\n <ControlItem label=\"Explore\">\n <Box sx={{ display: \"inline-flex\" }}>\n <Button\n size=\"xsmall\"\n color=\"neutral\"\n variant=\"outlined\"\n onClick={handleActionsClick}\n endIcon={<PiCaretDown />}\n sx={{ textTransform: \"none\", fontSize: \"0.75rem\" }}\n >\n Actions\n </Button>\n <Menu\n anchorEl={actionsAnchorEl}\n open={actionsOpen}\n onClose={handleActionsClose}\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n transformOrigin={{ vertical: \"top\", horizontal: \"right\" }}\n >\n <MenuItem\n disabled={featureToggles.disableDatabaseQuery}\n onClick={async () => {\n await onRunRowCount?.();\n handleActionsClose();\n }}\n >\n <ListItemIcon>\n <RowCountDiffIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText>Row Count</ListItemText>\n </MenuItem>\n </Menu>\n </Box>\n </ControlItem>\n )}\n </>\n )}\n {!isSingleEnvOnboarding && (\n <ControlItem label=\"Explore\">\n <Box sx={{ display: \"inline-flex\" }}>\n <Button\n size=\"xsmall\"\n color=\"neutral\"\n variant=\"outlined\"\n disabled={featureToggles.disableViewActionDropdown}\n onClick={handleActionsClick}\n endIcon={<PiCaretDown />}\n sx={{ textTransform: \"none\", fontSize: \"0.75rem\" }}\n >\n Actions\n </Button>\n <Menu\n anchorEl={actionsAnchorEl}\n open={actionsOpen}\n onClose={handleActionsClose}\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n transformOrigin={{ vertical: \"top\", horizontal: \"right\" }}\n >\n <ListSubheader\n sx={{ lineHeight: \"32px\", bgcolor: \"transparent\" }}\n >\n Diff\n </ListSubheader>\n <SetupConnectionPopoverSlot\n display={featureToggles.mode === \"metadata only\"}\n >\n <MenuItem\n disabled={featureToggles.disableDatabaseQuery}\n onClick={async () => {\n await onRunRowCountDiff?.();\n handleActionsClose();\n }}\n >\n <ListItemIcon>\n <RowCountDiffIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText>Row Count Diff</ListItemText>\n </MenuItem>\n </SetupConnectionPopoverSlot>\n <SetupConnectionPopoverSlot\n display={featureToggles.mode === \"metadata only\"}\n >\n <MenuItem\n disabled={featureToggles.disableDatabaseQuery}\n onClick={async () => {\n await onRunValueDiff?.();\n handleActionsClose();\n }}\n >\n <ListItemIcon>\n <ValueDiffIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText>Value Diff</ListItemText>\n </MenuItem>\n </SetupConnectionPopoverSlot>\n\n <Divider />\n\n <ListSubheader\n sx={{ lineHeight: \"32px\", bgcolor: \"transparent\" }}\n >\n Add to Checklist\n </ListSubheader>\n <MenuItem\n disabled={\n !(isNoSelect || (isMultiSelect && selectedNodes.length > 1))\n }\n onClick={() => {\n onAddLineageDiffCheck?.(viewOptions.view_mode);\n handleActionsClose();\n }}\n >\n <ListItemIcon>\n <LineageDiffIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText>Lineage Diff</ListItemText>\n </MenuItem>\n <MenuItem\n onClick={() => {\n onAddSchemaDiffCheck?.();\n handleActionsClose();\n }}\n >\n <ListItemIcon>\n <SchemaDiffIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText>Schema Diff</ListItemText>\n </MenuItem>\n </Menu>\n </Box>\n </ControlItem>\n )}\n </Stack>\n </Stack>\n );\n};\n","\"use client\";\n\n/**\n * @file LineageViewTopBarOss.tsx\n * @description OSS wrapper for the LineageViewTopBar component.\n *\n * This thin wrapper imports the core component from @datarecce/ui and injects\n * OSS-specific implementations including:\n * - Run type icons from the local registry\n * - HistoryToggle component\n * - SetupConnectionPopover component\n * - Context hooks for state management\n */\n\nimport type { ReactElement, Ref } from \"react\";\nimport {\n useLineageGraphContext,\n useLineageViewContextSafe,\n useRecceInstanceContext,\n useRecceServerFlag,\n} from \"../../../contexts\";\nimport { SetupConnectionPopover } from \"../../app\";\nimport { findByRunType } from \"../../run\";\nimport { HistoryToggle } from \"../../shared\";\nimport {\n LineageViewTopBar as LineageViewTopBarCore,\n type SetupConnectionPopoverSlotProps,\n} from \"./LineageViewTopBar\";\n\n/**\n * SetupConnectionPopover wrapper to adapt to the slot props interface.\n * We need to cast the children to match SetupConnectionPopover's expected type.\n */\nconst SetupConnectionPopoverSlot = ({\n display,\n children,\n}: SetupConnectionPopoverSlotProps) => {\n return (\n <SetupConnectionPopover display={display}>\n {\n children as ReactElement<{\n ref?: Ref<HTMLElement>;\n [key: string]: unknown;\n }>\n }\n </SetupConnectionPopover>\n );\n};\n\n/**\n * LineageViewTopBar component for OSS.\n *\n * Wraps the core @datarecce/ui component with OSS-specific implementations:\n * - Injects run type icons from the local registry\n * - Provides HistoryToggle slot\n * - Provides SetupConnectionPopover slot\n * - Connects to LineageViewContext for state\n */\nexport const LineageViewTopBarOss = () => {\n const {\n deselect,\n focusedNode,\n selectedNodes,\n viewOptions,\n onViewOptionsChanged,\n runRowCount,\n runRowCountDiff,\n runValueDiff,\n addLineageDiffCheck,\n addSchemaDiffCheck,\n } = useLineageViewContextSafe();\n\n const { lineageGraph } = useLineageGraphContext();\n const { featureToggles } = useRecceInstanceContext();\n const { data: flags } = useRecceServerFlag();\n const runTypeIcons = {\n rowCountDiff: findByRunType(\"row_count_diff\").icon,\n valueDiff: findByRunType(\"value_diff\").icon,\n lineageDiff: findByRunType(\"lineage_diff\").icon,\n schemaDiff: findByRunType(\"schema_diff\").icon,\n };\n\n return (\n <LineageViewTopBarCore\n viewOptions={viewOptions}\n onViewOptionsChanged={onViewOptionsChanged}\n lineageGraph={lineageGraph}\n featureToggles={featureToggles}\n serverFlags={flags}\n focusedNode={focusedNode}\n selectedNodes={selectedNodes}\n onDeselect={deselect}\n onRunRowCount={runRowCount}\n onRunRowCountDiff={runRowCountDiff}\n onRunValueDiff={runValueDiff}\n onAddLineageDiffCheck={addLineageDiffCheck}\n onAddSchemaDiffCheck={addSchemaDiffCheck}\n runTypeIcons={runTypeIcons}\n historyToggleSlot={<HistoryToggle />}\n SetupConnectionPopoverSlot={SetupConnectionPopoverSlot}\n />\n );\n};\n","\"use client\";\n\nimport type { Check } from \"../../api\";\nimport {\n type CllInput,\n type ColumnLineageData,\n createLineageDiffCheck,\n createSchemaDiffCheck,\n getCll,\n isHistogramDiffRun,\n isProfileDiffRun,\n isTopKDiffRun,\n isValueDiffDetailRun,\n isValueDiffRun,\n type LineageDiffViewOptions,\n select,\n} from \"../../api\";\nimport {\n LineageViewContext,\n useLineageGraphContext,\n useRecceActionContext,\n useRecceInstanceContext,\n} from \"../../contexts\";\nimport {\n isLineageGraphColumnNode,\n isLineageGraphNode,\n type LineageGraphColumnNode,\n type LineageGraphEdge,\n type LineageGraphNode,\n type LineageGraphNodes,\n type LineageViewContextType,\n} from \"../../contexts/lineage/types\";\nimport {\n type NodeColumnSetMap,\n selectDownstream,\n selectUpstream,\n union,\n} from \"../../contexts/lineage/utils\";\nimport {\n IGNORE_SCREENSHOT_CLASS,\n useApiConfig,\n useRun,\n useThemeColors,\n} from \"../../hooks\";\nimport { useMultiNodesActionOss as useMultiNodesAction } from \"../../hooks/useMultiNodesActionOss\";\nimport useValueDiffAlertDialog from \"../../hooks/useValueDiffAlertDialogOss\";\nimport {\n trackCopyToClipboard,\n trackMultiNodesAction,\n} from \"../../lib/api/track\";\nimport \"../../styles\";\nimport Box from \"@mui/material/Box\";\nimport Divider from \"@mui/material/Divider\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport {\n Background,\n BackgroundVariant,\n ControlButton,\n Controls,\n getNodesBounds,\n MiniMap,\n Node,\n Panel,\n ReactFlow,\n useEdgesState,\n useNodesState,\n useReactFlow,\n} from \"@xyflow/react\";\nimport \"@xyflow/react/dist/style.css\";\nimport { AxiosError } from \"axios\";\nimport React, {\n forwardRef,\n Ref,\n useCallback,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { FiCopy } from \"react-icons/fi\";\nimport { colors } from \"../../theme\";\nimport { LineageViewNotification } from \"../notifications\";\nimport { HSplit, toaster } from \"../ui\";\nimport { ActionControlOss } from \"./ActionControlOss\";\nimport { ColumnLevelLineageControlOss } from \"./ColumnLevelLineageControlOss\";\nimport { edgeTypes, getNodeColor, initialNodes, nodeTypes } from \"./config\";\nimport {\n useLineageCopyToClipboard,\n useNavToCheck,\n useResizeObserver,\n useTrackLineageRender,\n} from \"./hooks\";\nimport {\n LineageViewContextMenu,\n useLineageViewContextMenu,\n} from \"./LineageViewContextMenuOss\";\nimport { LineageLegend } from \"./legend\";\nimport { toReactFlow } from \"./lineage\";\nimport { NodeViewOss as NodeView } from \"./NodeViewOss\";\nimport SetupConnectionBanner from \"./SetupConnectionBannerOss\";\nimport { BaseEnvironmentSetupNotification } from \"./SingleEnvironmentQueryView\";\nimport {\n LineageViewError,\n LineageViewLoading,\n LineageViewNoChanges,\n} from \"./states\";\nimport { LineageViewTopBarOss as LineageViewTopBar } from \"./topbar/LineageViewTopBarOss\";\n\nexport interface LineageViewProps {\n viewOptions?: LineageDiffViewOptions;\n interactive?: boolean;\n weight?: number;\n height?: number;\n\n // to be removed\n // viewMode?: \"changed_models\" | \"all\"; // deprecated\n filterNodes?: (key: string, node: LineageGraphNode) => boolean;\n}\n\nexport interface LineageViewRef {\n copyToClipboard: () => void;\n}\n\nexport function PrivateLineageView(\n { interactive = false, ...props }: LineageViewProps,\n ref: Ref<LineageViewRef>,\n) {\n const { isDark } = useThemeColors();\n const { apiClient } = useApiConfig();\n const reactFlow = useReactFlow();\n const refResize = useRef<HTMLDivElement>(null);\n const {\n copyToClipboard,\n ImageDownloadModal,\n ref: refReactFlow,\n } = useLineageCopyToClipboard();\n const [nodes, setNodes, onNodesChange] =\n useNodesState<LineageGraphNodes>(initialNodes);\n const [edges, setEdges, onEdgesChange] = useEdgesState<LineageGraphEdge>([]);\n\n const {\n lineageGraph,\n retchLineageGraph,\n isLoading,\n error,\n refetchRunsAggregated,\n } = useLineageGraphContext();\n\n const { featureToggles, singleEnv } = useRecceInstanceContext();\n const { runId, showRunId, closeRunResult, runAction, isRunResultOpen } =\n useRecceActionContext();\n const { run } = useRun(runId);\n\n const [viewOptions, setViewOptions] = useState<LineageDiffViewOptions>({\n ...props.viewOptions,\n });\n\n const trackLineageRender = useTrackLineageRender();\n\n const cllHistory = useRef<(CllInput | undefined)[]>([]).current;\n\n const [cll, setCll] = useState<ColumnLineageData | undefined>(undefined);\n const actionGetCll = useMutation({\n mutationFn: (input: CllInput) => getCll(input, apiClient),\n });\n const [nodeColumnSetMap, setNodeColumSetMap] = useState<NodeColumnSetMap>({});\n\n const findNodeByName = useCallback(\n (name: string) => {\n return nodes.filter(isLineageGraphNode).find((n) => n.data.name === name);\n },\n [nodes],\n );\n\n // Expose the function to the parent via the ref\n useImperativeHandle(ref, () => ({\n copyToClipboard,\n }));\n\n const isModelsChanged = useMemo(() => {\n return !!(lineageGraph && lineageGraph.modifiedSet.length > 0);\n }, [lineageGraph]);\n\n /**\n * View mode\n * - all: show all nodes\n * - changed_models: show only changed models\n */\n const viewMode = viewOptions.view_mode ?? \"changed_models\";\n const filteredNodeIds: string[] = useMemo(() => {\n return nodes\n .filter((node) => node.type === \"lineageGraphNode\")\n .map((node) => node.id);\n }, [nodes]);\n const filteredNodes = useMemo(() => {\n if (!lineageGraph) {\n return [];\n }\n\n return filteredNodeIds.map((nodeId) => lineageGraph.nodes[nodeId]);\n }, [lineageGraph, filteredNodeIds]);\n\n /**\n * Focused node: the node that is currently focused. Show the NodeView when a node is focused\n */\n const [focusedNodeId, setFocusedNodeId] = useState<string>();\n const focusedNode = focusedNodeId\n ? lineageGraph?.nodes[focusedNodeId]\n : undefined;\n\n /**\n * Select mode: the behavior of clicking on nodes\n * - (undefined): no selection\n * - selecting: selecting nodes\n * - action_result: take action on selected nodes\n */\n const [selectMode, setSelectMode] = useState<\"selecting\" | \"action_result\">();\n const [selectedNodeIds, setSelectedNodeIds] = useState<Set<string>>(\n new Set(),\n );\n const selectedNodes = useMemo(() => {\n if (!lineageGraph) {\n return [];\n }\n\n const nodeIds = Array.from(selectedNodeIds);\n return nodeIds.map((nodeId) => lineageGraph.nodes[nodeId]);\n }, [lineageGraph, selectedNodeIds]);\n const multiNodeAction = useMultiNodesAction(\n selectedNodes.length > 0 ? selectedNodes : filteredNodes,\n {\n onActionStarted: () => {\n setSelectMode(\"action_result\");\n },\n onActionNodeUpdated: (updated: LineageGraphNode) => {\n // trigger a re-render by updating the nodes\n setNodes((nodes) =>\n nodes.map((node) => {\n if (node.id === updated.id) {\n return {\n ...node,\n };\n }\n return node;\n }),\n );\n },\n onActionCompleted: () => {\n return void 0;\n },\n },\n );\n\n /**\n * Highlighted nodes: the nodes that are highlighted. The behavior of highlighting depends on the select mode\n *\n * - Default: nodes in the impact radius, or all nodes if the impact radius is not available\n * - Focus: upstream/downstream nodes of the focused node\n * - Multi-select: nodes in the impact radius, or all nodes if the impact radius is not available\n * - Action Result: selected nodes\n */\n const highlighted = useMemo<Set<string>>(() => {\n if (!lineageGraph) {\n return new Set<string>();\n }\n\n let highlightedModels: Set<string> = new Set<string>();\n if (cll) {\n for (const [nodeId, node] of Object.entries(cll.current.nodes)) {\n if (node.impacted !== false) {\n highlightedModels.add(nodeId);\n }\n }\n for (const columnId of Object.keys(cll.current.columns)) {\n highlightedModels.add(columnId);\n }\n } else if (selectMode === \"action_result\") {\n const nodeIds = Object.keys(multiNodeAction.actionState.actions);\n highlightedModels = new Set(nodeIds);\n } else if (focusedNode) {\n highlightedModels = union(\n selectUpstream(lineageGraph, [focusedNode.id]),\n selectDownstream(lineageGraph, [focusedNode.id]),\n );\n } else if (isModelsChanged) {\n highlightedModels = selectDownstream(\n lineageGraph,\n lineageGraph.modifiedSet,\n );\n } else {\n highlightedModels = new Set(filteredNodeIds);\n }\n\n // Add columns in the highlighted models\n return new Set<string>(highlightedModels);\n }, [\n lineageGraph,\n cll,\n selectMode,\n focusedNode,\n isModelsChanged,\n multiNodeAction.actionState.actions,\n filteredNodeIds,\n ]);\n\n const lineageViewContextMenu = useLineageViewContextMenu();\n\n const closeContextMenu = () => {\n lineageViewContextMenu.closeContextMenu();\n };\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: Intentionally only run when lineageGraph changes (initial load/refetch).\n useLayoutEffect(() => {\n const t = async () => {\n let filteredNodeIds: string[] | undefined = undefined;\n\n if (!lineageGraph) {\n return;\n }\n\n if (viewOptions.node_ids) {\n filteredNodeIds = viewOptions.node_ids;\n } else {\n const packageName = lineageGraph.manifestMetadata.current?.project_name;\n const viewMode =\n viewOptions.view_mode ?? (isModelsChanged ? \"changed_models\" : \"all\");\n\n const newViewOptions: LineageDiffViewOptions = {\n view_mode: viewMode,\n packages: packageName ? [packageName] : undefined,\n ...props.viewOptions,\n };\n\n try {\n const result = await select(\n {\n select: newViewOptions.select,\n exclude: newViewOptions.exclude,\n packages: newViewOptions.packages,\n view_mode: newViewOptions.view_mode,\n },\n apiClient,\n );\n filteredNodeIds = result.nodes;\n } catch (_) {\n // fallback behavior\n newViewOptions.view_mode = \"all\";\n const result = await select(\n {\n select: newViewOptions.select,\n exclude: newViewOptions.exclude,\n packages: newViewOptions.packages,\n view_mode: newViewOptions.view_mode,\n },\n apiClient,\n );\n filteredNodeIds = result.nodes;\n }\n\n setViewOptions(newViewOptions);\n }\n\n let cll: ColumnLineageData | undefined;\n if (viewOptions.column_level_lineage) {\n try {\n cll = await actionGetCll.mutateAsync(\n viewOptions.column_level_lineage,\n );\n } catch (e) {\n if (e instanceof AxiosError) {\n const e2 = e as AxiosError<{ detail?: string }>;\n toaster.create({\n title: \"Column Level Lineage error\",\n description: e2.response?.data.detail ?? e.message,\n type: \"error\",\n closable: true,\n });\n return;\n }\n }\n }\n\n const [nodes, edges, nodeColumnSetMap] = await toReactFlow(lineageGraph, {\n selectedNodes: filteredNodeIds,\n cll: cll,\n });\n setNodes(nodes);\n setEdges(edges);\n setNodeColumSetMap(nodeColumnSetMap);\n setCll(cll);\n\n // TODO : code smell: vioates DRY. This really shouldn't hit both here and below\n\n // Track lineage view render\n trackLineageRender(\n nodes,\n viewOptions.view_mode ?? \"changed_models\",\n viewOptions.column_level_lineage?.change_analysis ?? false,\n !!viewOptions.column_level_lineage?.column,\n !!focusedNodeId || !!run,\n );\n };\n\n void t();\n // Intentionally only run when lineageGraph changes (initial load/refetch).\n // viewOptions changes are handled separately by handleViewOptionsChanged.\n // Other dependencies (setNodes, setEdges, actionGetCll) are stable.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [lineageGraph]);\n\n const onNodeViewClosed = () => {\n setFocusedNodeId(undefined);\n };\n\n const centerNode = async (nodeId: string) => {\n let node = nodes.find((n) => n.id === nodeId);\n if (!node) {\n return;\n }\n\n if (node.parentId) {\n const parentId = node.parentId;\n node = nodes.find((n) => n.id === parentId) ?? node;\n }\n\n if (node.measured != null) {\n const { width, height } = node.measured;\n if (width && height) {\n const x = node.position.x + width / 2;\n const y = node.position.y + height / 2;\n const zoom = reactFlow.getZoom();\n\n await reactFlow.setCenter(x, y, { zoom, duration: 200 });\n }\n }\n };\n\n const navToCheck = useNavToCheck();\n\n useResizeObserver(refResize, async () => {\n if (selectMode !== \"selecting\") {\n if (!focusedNodeId) {\n await reactFlow.fitView({ nodes, duration: 200 });\n } else {\n await centerNode(focusedNodeId);\n }\n }\n });\n\n const showColumnLevelLineage = async (\n columnLevelLineage?: CllInput,\n previous = false,\n ) => {\n const previousColumnLevelLineage = viewOptions.column_level_lineage;\n\n await handleViewOptionsChanged(\n {\n ...viewOptions,\n column_level_lineage: columnLevelLineage,\n },\n false,\n );\n\n if (!previous) {\n cllHistory.push(previousColumnLevelLineage);\n }\n if (columnLevelLineage?.node_id) {\n setFocusedNodeId(columnLevelLineage.node_id);\n } else {\n setFocusedNodeId(undefined);\n }\n };\n\n const resetColumnLevelLineage = async (previous?: boolean) => {\n if (previous) {\n if (cllHistory.length === 0) {\n return;\n }\n const previousCll = cllHistory.pop();\n if (previousCll) {\n await showColumnLevelLineage(previousCll, true);\n } else {\n await showColumnLevelLineage(undefined, true);\n }\n } else {\n await showColumnLevelLineage(undefined, true);\n }\n };\n\n const onColumnNodeClick = (\n event: React.MouseEvent,\n node: LineageGraphColumnNode,\n ) => {\n if (selectMode) {\n return;\n }\n\n void showColumnLevelLineage({\n node_id: node.data.node.id,\n column: node.data.column,\n });\n };\n\n const onNodeClick = (event: React.MouseEvent, node: Node) => {\n if (!interactive) return;\n if (!lineageGraph) {\n return;\n }\n\n if (isLineageGraphColumnNode(node as LineageGraphNodes)) {\n onColumnNodeClick(event, node as LineageGraphColumnNode);\n return;\n }\n\n closeContextMenu();\n if (!selectMode) {\n setFocusedNodeId(node.id);\n } else if (selectMode === \"action_result\") {\n const action = multiNodeAction.actionState.actions[node.id];\n if (action.run?.run_id) {\n showRunId(action.run.run_id);\n }\n setFocusedNodeId(node.id);\n } else {\n const newSet = new Set(selectedNodeIds);\n if (selectedNodeIds.has(node.id)) {\n newSet.delete(node.id);\n } else {\n newSet.add(node.id);\n }\n setSelectedNodeIds(newSet);\n if (newSet.size === 0) {\n setSelectMode(undefined);\n }\n }\n };\n\n const refreshLayout = async (options: {\n viewOptions?: LineageDiffViewOptions;\n fitView?: boolean;\n }) => {\n let { viewOptions: newViewOptions = viewOptions } = options;\n const { fitView } = options;\n\n let selectedNodes: string[] | undefined = undefined;\n\n if (!lineageGraph) {\n return;\n }\n\n const reselect =\n viewOptions.select !== newViewOptions.select ||\n viewOptions.exclude !== newViewOptions.exclude ||\n viewOptions.packages !== newViewOptions.packages ||\n viewOptions.view_mode !== newViewOptions.view_mode;\n\n if (reselect) {\n try {\n const result = await select(\n {\n select: newViewOptions.select,\n exclude: newViewOptions.exclude,\n packages: newViewOptions.packages,\n view_mode: newViewOptions.view_mode,\n },\n apiClient,\n );\n // focus to unfocus the model or column node\n newViewOptions = { ...newViewOptions, column_level_lineage: undefined };\n selectedNodes = result.nodes;\n } catch (e) {\n if (e instanceof AxiosError) {\n const e2 = e as AxiosError<{ detail?: string }>;\n toaster.create({\n title: \"Select node error\",\n description: e2.response?.data.detail ?? e.message,\n type: \"error\",\n closable: true,\n });\n }\n return;\n }\n setFocusedNodeId(undefined);\n } else {\n selectedNodes = nodes.map((n) => n.id);\n }\n\n let cll: ColumnLineageData | undefined;\n if (newViewOptions.column_level_lineage) {\n try {\n cll = await actionGetCll.mutateAsync(\n newViewOptions.column_level_lineage,\n );\n } catch (e) {\n if (e instanceof AxiosError) {\n const e2 = e as AxiosError<{ detail?: string }>;\n toaster.create({\n title: \"Column Level Lineage error\",\n description: e2.response?.data.detail ?? e.message,\n type: \"error\",\n closable: true,\n });\n return;\n }\n }\n }\n\n const [newNodes, newEdges, newNodeColumnSetMap] = await toReactFlow(\n lineageGraph,\n {\n selectedNodes,\n cll,\n },\n );\n setNodes(newNodes);\n setEdges(newEdges);\n setNodeColumSetMap(newNodeColumnSetMap);\n setCll(cll);\n\n // Track lineage view render\n trackLineageRender(\n newNodes,\n newViewOptions.view_mode ?? \"changed_models\",\n newViewOptions.column_level_lineage?.change_analysis ?? false,\n !!newViewOptions.column_level_lineage?.column,\n !!focusedNodeId || !!run,\n );\n\n // Close the run result view if the run result node is not in the new nodes\n if (\n run &&\n (isTopKDiffRun(run) ||\n isProfileDiffRun(run) ||\n isHistogramDiffRun(run) ||\n isValueDiffRun(run) ||\n isValueDiffDetailRun(run))\n ) {\n if (run.params?.model && !findNodeByName(run.params.model)) {\n closeRunResult();\n }\n }\n\n if (fitView) {\n await new Promise((resolve) => setTimeout(resolve, 1));\n (() => {\n void reactFlow.fitView({ nodes: newNodes, duration: 200 });\n })();\n }\n };\n\n const handleViewOptionsChanged = async (\n newViewOptions: LineageDiffViewOptions,\n fitView = true,\n ) => {\n setViewOptions(newViewOptions);\n await refreshLayout({\n viewOptions: newViewOptions,\n fitView,\n });\n };\n\n const valueDiffAlertDialog = useValueDiffAlertDialog();\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: handleViewOptionsChanged and onNodeClick are intentionally omitted\n useEffect(() => {\n const runResultType = run?.type;\n if (!interactive) {\n // Skip the following logic if the view is not interactive\n return;\n }\n if (!isRunResultOpen) {\n // Skip the following logic if the run result is not open\n return;\n }\n if (\n !runResultType ||\n [\"query_diff\", \"query\", \"row_count\"].includes(runResultType)\n ) {\n // Skip the following logic if the run result type is not related to a node\n return;\n }\n\n if (!selectMode) {\n // Skip the following logic if the select mode is not single\n let selectedRunModel = undefined;\n if (\n isTopKDiffRun(run) ||\n isProfileDiffRun(run) ||\n isHistogramDiffRun(run) ||\n isValueDiffRun(run) ||\n isValueDiffDetailRun(run)\n ) {\n selectedRunModel = run.params?.model;\n }\n\n // Create a mock MouseEvent\n const mockEvent = new MouseEvent(\"click\", {\n bubbles: true,\n cancelable: true,\n view: window,\n }) as unknown as React.MouseEvent;\n\n if (selectedRunModel) {\n // If the run result is related to a node, select the node to show NodeView\n const node = findNodeByName(selectedRunModel);\n if (!node) {\n // Cannot find the node in the current nodes, try to change the view mode to 'all'\n void handleViewOptionsChanged({\n ...viewOptions,\n view_mode: \"all\",\n });\n } else if (isLineageGraphNode(node) && focusedNode !== node.data.data) {\n // Only select the node if it is not already selected\n onNodeClick(mockEvent, node);\n }\n } else {\n // If the run result is not related to a node, close the NodeView\n onNodeViewClosed();\n }\n }\n // handleViewOptionsChanged and onNodeClick are intentionally omitted to prevent\n // unnecessary re-runs. These functions are called conditionally within the effect\n // and don't need to trigger the effect when they change.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n run,\n viewOptions,\n isRunResultOpen,\n selectMode,\n findNodeByName,\n focusedNode,\n interactive,\n ]);\n\n const selectParentNodes = (nodeId: string, degree = 1000) => {\n if (selectMode === \"action_result\" || lineageGraph === undefined) return;\n\n if (!selectMode) {\n setSelectMode(\"selecting\");\n multiNodeAction.reset();\n if (viewOptions.column_level_lineage) {\n void handleViewOptionsChanged({\n ...viewOptions,\n column_level_lineage: undefined,\n });\n }\n }\n\n const upstream = selectUpstream(lineageGraph, [nodeId], degree);\n setSelectedNodeIds(union(selectedNodeIds, upstream));\n };\n\n const selectChildNodes = (nodeId: string, degree = 1000) => {\n if (selectMode === \"action_result\" || lineageGraph === undefined) return;\n\n if (!selectMode) {\n setSelectMode(\"selecting\");\n multiNodeAction.reset();\n if (viewOptions.column_level_lineage) {\n void handleViewOptionsChanged({\n ...viewOptions,\n column_level_lineage: undefined,\n });\n }\n }\n\n const downstream = selectDownstream(lineageGraph, [nodeId], degree);\n setSelectedNodeIds(union(selectedNodeIds, downstream));\n };\n\n const onNodeContextMenu = (\n event: React.MouseEvent,\n node: LineageGraphNodes,\n ) => {\n if (!interactive) {\n return;\n }\n if (selectMode === \"action_result\") {\n return;\n }\n // Only show context menu when selectMode is action\n // Prevent native context menu from showing\n event.preventDefault();\n const reactFlowDiv = refReactFlow.current as unknown as HTMLDivElement;\n const pane = reactFlowDiv.getBoundingClientRect();\n const x = event.clientX - pane.left;\n const y = event.clientY - pane.top + reactFlowDiv.offsetTop;\n lineageViewContextMenu.showContextMenu(x, y, node);\n };\n\n const selectNode = (nodeId: string) => {\n if (!selectMode) {\n if (!lineageGraph) {\n return;\n }\n\n setSelectedNodeIds(new Set([nodeId]));\n setSelectMode(\"selecting\");\n setFocusedNodeId(undefined);\n multiNodeAction.reset();\n } else if (selectMode === \"selecting\") {\n const newSelectedNodeIds = new Set(selectedNodeIds);\n if (selectedNodeIds.has(nodeId)) {\n newSelectedNodeIds.delete(nodeId);\n } else {\n newSelectedNodeIds.add(nodeId);\n }\n\n setSelectedNodeIds(newSelectedNodeIds);\n if (newSelectedNodeIds.size === 0) {\n setSelectMode(undefined);\n }\n }\n };\n const deselect = () => {\n setSelectMode(undefined);\n setSelectedNodeIds(new Set());\n setFocusedNodeId(undefined);\n closeRunResult();\n refetchRunsAggregated?.();\n };\n\n const contextValue: LineageViewContextType = {\n interactive,\n nodes,\n focusedNode,\n selectedNodes,\n viewOptions,\n showContextMenu: onNodeContextMenu,\n onViewOptionsChanged: handleViewOptionsChanged,\n selectMode,\n selectNode,\n selectParentNodes,\n selectChildNodes,\n deselect,\n isNodeHighlighted: (nodeId: string) => highlighted.has(nodeId),\n isNodeSelected: (nodeId: string) => selectedNodeIds.has(nodeId),\n isEdgeHighlighted: (source, target) => {\n if (!cll) {\n return highlighted.has(source) && highlighted.has(target);\n } else {\n if (!(source in cll.current.parent_map)) {\n return false;\n }\n return target in cll.current.parent_map[source];\n }\n },\n isNodeShowingChangeAnalysis: (nodeId: string) => {\n if (!lineageGraph) {\n return false;\n }\n\n const node =\n nodeId in lineageGraph.nodes ? lineageGraph.nodes[nodeId] : undefined;\n\n if (viewOptions.column_level_lineage?.change_analysis) {\n const cll = viewOptions.column_level_lineage;\n\n if (cll.node_id && !cll.column) {\n return cll.node_id === nodeId && !!node?.data.changeStatus;\n } else {\n return !!node?.data.changeStatus;\n }\n }\n\n return false;\n },\n getNodeAction: (nodeId: string) => {\n return multiNodeAction.actionState.actions[nodeId];\n },\n getNodeColumnSet: (nodeId: string) => {\n if (!(nodeId in nodeColumnSetMap)) {\n return new Set<string>();\n }\n\n return new Set(nodeColumnSetMap[nodeId]);\n },\n runRowCount: async () => {\n if (selectMode === \"selecting\") {\n await multiNodeAction.runRowCount();\n trackMultiNodesAction({ type: \"row_count\", selected: \"multi\" });\n } else if (focusedNode) {\n runAction(\n \"row_count\",\n { node_names: [focusedNode.data.name] },\n { showForm: false, showLast: false },\n );\n trackMultiNodesAction({ type: \"row_count\", selected: \"single\" });\n } else {\n runAction(\"row_count\", {\n select: viewOptions.select,\n exclude: viewOptions.exclude,\n packages: viewOptions.packages,\n view_mode: viewOptions.view_mode,\n });\n trackMultiNodesAction({ type: \"row_count\", selected: \"none\" });\n }\n },\n runRowCountDiff: async () => {\n if (selectMode === \"selecting\") {\n await multiNodeAction.runRowCountDiff();\n trackMultiNodesAction({ type: \"row_count_diff\", selected: \"multi\" });\n } else if (focusedNode) {\n runAction(\n \"row_count_diff\",\n { node_names: [focusedNode.data.name] },\n { showForm: false, showLast: false },\n );\n trackMultiNodesAction({ type: \"row_count_diff\", selected: \"single\" });\n } else {\n runAction(\"row_count_diff\", {\n select: viewOptions.select,\n exclude: viewOptions.exclude,\n packages: viewOptions.packages,\n view_mode: viewOptions.view_mode,\n });\n trackMultiNodesAction({ type: \"row_count_diff\", selected: \"none\" });\n }\n },\n runValueDiff: async () => {\n if (focusedNode) {\n runAction(\n \"value_diff\",\n {\n model: focusedNode.data.name,\n },\n { showForm: true, showLast: false },\n );\n trackMultiNodesAction({ type: \"value_diff\", selected: \"single\" });\n } else {\n const nodeCount =\n selectMode === \"selecting\"\n ? selectedNodes.length\n : filteredNodeIds.length;\n if (await valueDiffAlertDialog.confirm(nodeCount)) {\n await multiNodeAction.runValueDiff();\n trackMultiNodesAction({\n type: \"value_diff\",\n selected: selectMode === \"selecting\" ? \"multi\" : \"none\",\n });\n }\n }\n },\n addLineageDiffCheck: async () => {\n let check: Check | undefined = undefined;\n if (selectMode === \"selecting\") {\n check = await multiNodeAction.addLineageDiffCheck();\n deselect();\n trackMultiNodesAction({ type: \"lineage_diff\", selected: \"multi\" });\n } else if (!focusedNode) {\n check = await createLineageDiffCheck(viewOptions, apiClient);\n trackMultiNodesAction({ type: \"lineage_diff\", selected: \"none\" });\n }\n\n if (check) {\n navToCheck(check);\n }\n },\n addSchemaDiffCheck: async () => {\n let check: Check | undefined = undefined;\n\n if (selectMode === \"selecting\") {\n if (selectedNodes.length > 0) {\n check = await multiNodeAction.addSchemaDiffCheck();\n deselect();\n trackMultiNodesAction({ type: \"schema_diff\", selected: \"multi\" });\n }\n } else if (focusedNode) {\n check = await createSchemaDiffCheck(\n {\n node_id: focusedNode.id,\n },\n apiClient,\n );\n trackMultiNodesAction({ type: \"schema_diff\", selected: \"single\" });\n } else {\n check = await createSchemaDiffCheck(\n {\n select: viewOptions.select,\n exclude: viewOptions.exclude,\n packages: viewOptions.packages,\n view_mode: viewOptions.view_mode,\n },\n apiClient,\n );\n trackMultiNodesAction({ type: \"schema_diff\", selected: \"none\" });\n }\n\n if (check) {\n navToCheck(check);\n }\n },\n cancel: multiNodeAction.cancel,\n actionState: multiNodeAction.actionState,\n\n // Column Level Lineage\n centerNode,\n cll,\n showColumnLevelLineage,\n resetColumnLevelLineage,\n };\n\n if (isLoading) {\n return <LineageViewLoading />;\n }\n\n if (error) {\n return <LineageViewError error={error} onRetry={retchLineageGraph} />;\n }\n\n if (!lineageGraph || nodes == initialNodes) {\n return <></>;\n }\n\n if (viewMode === \"changed_models\" && !lineageGraph.modifiedSet.length) {\n return (\n <LineageViewNoChanges\n viewOptions={viewOptions}\n onViewOptionsChanged={handleViewOptionsChanged}\n />\n );\n }\n return (\n <LineageViewContext.Provider value={contextValue}>\n <HSplit\n sizes={focusedNode ? [70, 30] : [100, 0]}\n minSize={focusedNode ? 400 : 0}\n gutterSize={focusedNode ? 5 : 0}\n style={{ height: \"100%\", width: \"100%\" }}\n >\n <Stack\n ref={refResize}\n divider={<Divider sx={{ borderColor: \"grey.200\" }} />}\n spacing={0}\n sx={{ contain: \"strict\", position: \"relative\" }}\n >\n {interactive && (\n <>\n <LineageViewTopBar />\n {featureToggles.mode === \"metadata only\" && (\n <SetupConnectionBanner />\n )}\n </>\n )}\n <ReactFlow\n proOptions={{\n hideAttribution: true,\n }}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n nodes={nodes}\n edges={edges}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onNodeClick={onNodeClick}\n onNodeContextMenu={onNodeContextMenu}\n onClick={closeContextMenu}\n onInit={async () => {\n if (isModelsChanged) {\n await reactFlow.fitView();\n } else {\n const bounds = getNodesBounds(nodes, {});\n await reactFlow.setCenter(\n bounds.x + bounds.width / 2,\n bounds.y + bounds.height / 2,\n {\n zoom: 1,\n },\n );\n }\n }}\n maxZoom={1}\n minZoom={0.1}\n nodesDraggable={interactive}\n ref={refReactFlow as unknown as Ref<HTMLDivElement>}\n colorMode={isDark ? \"dark\" : \"light\"}\n >\n <Background\n id=\"lineage-bg\"\n variant={BackgroundVariant.Dots}\n color={isDark ? colors.neutral[700] : colors.neutral[300]}\n gap={20}\n size={2}\n />\n <Controls\n showInteractive={false}\n position=\"top-right\"\n className={IGNORE_SCREENSHOT_CLASS}\n style={{\n backgroundColor: isDark ? colors.neutral[700] : undefined,\n borderColor: isDark ? colors.neutral[600] : undefined,\n }}\n >\n <ControlButton\n title=\"copy image\"\n onClick={async () => {\n await copyToClipboard();\n trackCopyToClipboard({\n type: viewMode,\n from: \"lineage_view\",\n });\n }}\n style={{\n backgroundColor: isDark ? colors.neutral[700] : undefined,\n color: isDark ? colors.neutral[200] : undefined,\n }}\n >\n <Box component={FiCopy} />\n </ControlButton>\n </Controls>\n <ImageDownloadModal />\n <Panel position=\"bottom-left\">\n <Stack spacing=\"5px\">\n {isModelsChanged && <LineageLegend variant=\"changeStatus\" />}\n {viewOptions.column_level_lineage && (\n <LineageLegend variant=\"transformation\" />\n )}\n </Stack>\n </Panel>\n <Panel position=\"top-center\">\n <LineageViewNotification\n notification={\n singleEnv ? <BaseEnvironmentSetupNotification /> : null\n }\n type={\"info\"}\n />\n </Panel>\n <Panel position=\"top-left\">\n <Stack spacing=\"5px\">\n <ColumnLevelLineageControlOss action={actionGetCll} />\n {nodes.length == 0 && (\n <Typography\n sx={{ fontSize: \"1.25rem\", color: \"grey\", opacity: 0.5 }}\n >\n No nodes\n </Typography>\n )}\n </Stack>\n </Panel>\n <MiniMap\n nodeColor={getNodeColor}\n nodeStrokeWidth={3}\n zoomable\n pannable\n bgColor={isDark ? colors.neutral[800] : undefined}\n maskColor={\n isDark ? `${colors.neutral[900]}99` : `${colors.neutral[100]}99`\n }\n />\n {selectMode === \"action_result\" && (\n <Panel\n position=\"bottom-center\"\n className={IGNORE_SCREENSHOT_CLASS}\n >\n <ActionControlOss\n onClose={() => {\n deselect();\n }}\n />\n </Panel>\n )}\n </ReactFlow>\n <LineageViewContextMenu {...lineageViewContextMenu.props} />\n </Stack>\n {focusedNode ? (\n <Box\n sx={{\n borderLeft: \"solid 1px\",\n borderColor: \"divider\",\n height: \"100%\",\n }}\n >\n <NodeView node={focusedNode} onCloseNode={onNodeViewClosed} />\n </Box>\n ) : (\n <Box></Box>\n )}\n </HSplit>\n {valueDiffAlertDialog.AlertDialog}\n </LineageViewContext.Provider>\n );\n}\n\nexport const LineageViewOss = forwardRef<LineageViewRef, LineageViewProps>(\n PrivateLineageView,\n);\n","\"use client\";\n\nimport { ReactFlowProvider } from \"@xyflow/react\";\nimport { LineageViewOss } from \"./LineageViewOss\";\n\nexport function LineagePageOss() {\n return (\n <ReactFlowProvider>\n <LineageViewOss interactive />\n </ReactFlowProvider>\n );\n}\n","import MuiAvatar from \"@mui/material/Avatar\";\nimport Box from \"@mui/material/Box\";\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport Divider from \"@mui/material/Divider\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport Menu from \"@mui/material/Menu\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport Typography from \"@mui/material/Typography\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { type MouseEvent, useState } from \"react\";\nimport { FaCloud, FaUser } from \"react-icons/fa\";\nimport { cacheKeys } from \"../../api\";\nimport { useApiConfig } from \"../../hooks\";\nimport { fetchGitHubAvatar, fetchUser } from \"../../lib/api/user\";\nimport { RECCE_SUPPORT_CALENDAR_URL } from \"../../lib/const\";\n\nexport default function AvatarDropdown() {\n const { apiClient } = useApiConfig();\n const {\n data: user,\n isLoading,\n error,\n } = useQuery({\n queryKey: cacheKeys.user(),\n queryFn: () => fetchUser(apiClient),\n retry: false,\n });\n\n const { data: avatarUrl } = useQuery({\n queryKey: [\"github-avatar\", user?.id],\n queryFn: () => (user ? fetchGitHubAvatar(user.id) : Promise.resolve(null)),\n enabled: !!user?.id && user.login_type === \"github\",\n retry: false,\n staleTime: 5 * 60 * 1000, // Cache for 5 minutes\n });\n\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n\n const handleClick = (event: MouseEvent<HTMLElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const showUserInfo = !isLoading && !error && user;\n\n // Get initials for avatar fallback\n const getInitials = (name?: string) => {\n if (!name) return \"U\";\n return name.charAt(0).toUpperCase();\n };\n\n return (\n <>\n {isLoading ? (\n <Box\n onClick={handleClick}\n sx={{\n width: 32,\n height: 32,\n borderRadius: \"50%\",\n bgcolor: \"background.paper\",\n color: \"primary.main\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n }}\n >\n <CircularProgress size={16} />\n </Box>\n ) : (\n <MuiAvatar\n onClick={handleClick}\n src={avatarUrl || undefined}\n sx={{\n width: 28,\n height: 28,\n cursor: \"pointer\",\n outline: \"1px solid white\",\n fontSize: \"0.875rem\",\n }}\n >\n {getInitials(user?.login)}\n </MuiAvatar>\n )}\n <Menu\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n slotProps={{\n paper: {\n sx: {\n bgcolor: \"background.paper\",\n borderColor: \"divider\",\n boxShadow: 3,\n minWidth: 180,\n },\n },\n }}\n >\n <Box sx={{ px: 2, py: 1.5 }}>\n {isLoading && (\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\n <Typography variant=\"body2\" color=\"text.primary\">\n Loading...\n </Typography>\n <CircularProgress size={16} />\n </Box>\n )}\n {error && (\n <Typography variant=\"caption\" color=\"error\">\n Failed to load user information\n </Typography>\n )}\n {showUserInfo && (\n <>\n <Typography variant=\"body2\" fontWeight=\"600\" color=\"text.primary\">\n {user.login}\n </Typography>\n {user.email && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {user.email}\n </Typography>\n )}\n </>\n )}\n </Box>\n <Divider />\n <MenuItem\n onClick={() => {\n window.open(\"https://cloud.datarecce.io/\", \"_blank\");\n handleClose();\n }}\n >\n <ListItemIcon>\n <FaCloud />\n </ListItemIcon>\n <ListItemText>Recce Cloud</ListItemText>\n </MenuItem>\n <MenuItem\n onClick={() => {\n window.open(RECCE_SUPPORT_CALENDAR_URL, \"_blank\");\n handleClose();\n }}\n >\n <ListItemIcon>\n <FaUser />\n </ListItemIcon>\n <ListItemText>Get live support</ListItemText>\n </MenuItem>\n </Menu>\n </>\n );\n}\n","\"use client\";\n\nimport IconButton from \"@mui/material/IconButton\";\nimport Tooltip from \"@mui/material/Tooltip\";\nimport { useTheme } from \"next-themes\";\nimport { useEffect, useState } from \"react\";\nimport { PiMoon, PiSun } from \"react-icons/pi\";\n\n/**\n * Display Mode Toggle - switches between light and dark themes\n *\n * Uses next-themes to persist the user's preference.\n * Default is light theme, with future support for system preference.\n */\nexport const DisplayModeToggleOss = () => {\n const { setTheme, resolvedTheme } = useTheme();\n const [mounted, setMounted] = useState(false);\n\n // Avoid hydration mismatch by only rendering after mount\n useEffect(() => {\n setMounted(true);\n }, []);\n\n const toggleTheme = () => {\n setTheme(resolvedTheme === \"dark\" ? \"light\" : \"dark\");\n };\n\n // Don't render anything until mounted to avoid hydration mismatch\n if (!mounted) {\n return (\n <IconButton\n size=\"small\"\n sx={{\n color: \"rgba(255, 255, 255, 0.8)\",\n \"&:hover\": { bgcolor: \"rgba(255, 255, 255, 0.1)\" },\n }}\n disabled\n >\n <PiSun style={{ width: 18, height: 18 }} />\n </IconButton>\n );\n }\n\n const isDark = resolvedTheme === \"dark\";\n\n return (\n <Tooltip title={isDark ? \"Switch to light mode\" : \"Switch to dark mode\"}>\n <IconButton\n size=\"small\"\n onClick={toggleTheme}\n sx={{\n color: \"rgba(255, 255, 255, 0.8)\",\n \"&:hover\": { bgcolor: \"rgba(255, 255, 255, 0.1)\" },\n }}\n aria-label={isDark ? \"Switch to light mode\" : \"Switch to dark mode\"}\n >\n {isDark ? (\n <PiSun style={{ width: 18, height: 18 }} />\n ) : (\n <PiMoon style={{ width: 18, height: 18 }} />\n )}\n </IconButton>\n </Tooltip>\n );\n};\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport MuiDialog from \"@mui/material/Dialog\";\nimport DialogActions from \"@mui/material/DialogActions\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport Divider from \"@mui/material/Divider\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Link from \"@mui/material/Link\";\nimport Stack from \"@mui/material/Stack\";\nimport Table from \"@mui/material/Table\";\nimport TableBody from \"@mui/material/TableBody\";\nimport TableCell from \"@mui/material/TableCell\";\nimport TableContainer from \"@mui/material/TableContainer\";\nimport TableHead from \"@mui/material/TableHead\";\nimport TableRow from \"@mui/material/TableRow\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport { isEmpty } from \"lodash\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { IoClose } from \"react-icons/io5\";\nimport { LuExternalLink } from \"react-icons/lu\";\nimport { PiInfo } from \"react-icons/pi\";\nimport {\n type EnvInfo as EnvInfoType,\n useLineageGraphContext,\n} from \"../../contexts\";\nimport {\n type EnvironmentConfigProps,\n trackEnvironmentConfig,\n} from \"../../lib/api/track\";\nimport { extractSchemas, formatTimestamp, formatTimeToNow } from \"../../utils\";\n\nfunction buildEnvironmentTrackingData(\n envInfo: EnvInfoType | undefined,\n reviewMode: boolean | undefined,\n baseSchemas: Set<string>,\n currentSchemas: Set<string>,\n): EnvironmentConfigProps {\n const git = envInfo?.git;\n const pr = envInfo?.pullRequest;\n const dbtBase = envInfo?.dbt?.base;\n const dbtCurrent = envInfo?.dbt?.current;\n\n const trackingData: EnvironmentConfigProps = {\n review_mode: reviewMode || false,\n adapter_type: envInfo?.adapterType || null,\n has_git_info: !isEmpty(git),\n has_pr_info: !isEmpty(pr),\n };\n\n // DBT-specific tracking\n if (envInfo?.adapterType === \"dbt\") {\n trackingData.base = {\n schema_count: baseSchemas.size,\n dbt_version: dbtBase?.dbt_version || null,\n timestamp: dbtBase?.generated_at || null,\n };\n trackingData.current = {\n schema_count: currentSchemas.size,\n dbt_version: dbtCurrent?.dbt_version || null,\n timestamp: dbtCurrent?.generated_at || null,\n };\n trackingData.schemas_match =\n baseSchemas.size === currentSchemas.size &&\n Array.from(baseSchemas).every((s) => currentSchemas.has(s));\n }\n\n // SQLMesh-specific tracking\n if (envInfo?.adapterType === \"sqlmesh\") {\n trackingData.base = {\n has_env: !!envInfo.sqlmesh?.base_env,\n };\n trackingData.current = {\n has_env: !!envInfo.sqlmesh?.current_env,\n };\n }\n\n return trackingData;\n}\n\nfunction renderInfoEntries(info: object): React.JSX.Element[] {\n if (Object.values(info).every((value) => value === null)) {\n return [\n <Box key={\"no info\"} sx={{ ml: \"10px\" }}>\n No information\n </Box>,\n ];\n }\n\n return Object.entries(info)\n .filter(\n ([key, value]) => key !== \"url\" && value !== null && value !== undefined,\n )\n .map(([key, value]) => (\n <li key={key} style={{ marginLeft: \"10px\" }}>\n {key}: {value}\n </li>\n ));\n}\n\nexport function EnvInfo() {\n const { envInfo, reviewMode, lineageGraph } = useLineageGraphContext();\n const [open, setOpen] = useState(false);\n const git = envInfo?.git;\n const pr = envInfo?.pullRequest;\n const reviewInfo = { ...git, ...pr };\n\n const dbtBase = envInfo?.dbt?.base;\n const dbtCurrent = envInfo?.dbt?.current;\n\n const baseTime = dbtBase?.generated_at\n ? formatTimestamp(dbtBase.generated_at)\n : \"\";\n const currentTime = dbtCurrent?.generated_at\n ? formatTimestamp(dbtCurrent.generated_at)\n : \"\";\n let baseRelativeTime = \"\";\n let currentRelativeTime = \"\";\n if (dbtBase) {\n baseRelativeTime = dbtBase.generated_at\n ? formatTimeToNow(dbtBase.generated_at)\n : \"\";\n }\n if (dbtCurrent) {\n currentRelativeTime = dbtCurrent.generated_at\n ? formatTimeToNow(dbtCurrent.generated_at)\n : \"\";\n }\n const [baseSchemas, currentSchemas] = extractSchemas(lineageGraph);\n\n // Track environment configuration once at startup\n const hasTrackedRef = useRef(false);\n useEffect(() => {\n if (!hasTrackedRef.current && envInfo) {\n hasTrackedRef.current = true;\n const trackingData = buildEnvironmentTrackingData(\n envInfo,\n reviewMode,\n baseSchemas,\n currentSchemas,\n );\n trackEnvironmentConfig(trackingData);\n }\n }, [envInfo, reviewMode, baseSchemas, currentSchemas]);\n\n const handleOpen = () => setOpen(true);\n const handleClose = () => setOpen(false);\n\n return (\n <>\n <MuiTooltip title=\"Environment Info\" placement=\"bottom-end\">\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n cursor: \"pointer\",\n \"&:hover\": {\n color: \"text.primary\",\n },\n }}\n onClick={handleOpen}\n >\n <Stack\n direction=\"column\"\n sx={{\n display: { xs: \"none\", lg: \"flex\" },\n fontSize: \"0.875rem\",\n }}\n >\n <Box sx={{ display: \"flex\", gap: 0.5 }}>\n <Typography\n component=\"span\"\n noWrap\n sx={{ color: \"warning.main\", maxWidth: 128 }}\n className=\"no-track-pii-safe\"\n >\n {Array.from(baseSchemas).join(\", \")}\n </Typography>{\" \"}\n ({baseRelativeTime})\n </Box>\n <Box sx={{ display: \"flex\", gap: 0.5 }}>\n <Typography\n component=\"span\"\n noWrap\n sx={{ color: \"primary.main\", maxWidth: 128 }}\n className=\"no-track-pii-safe\"\n >\n {Array.from(currentSchemas).join(\", \")}\n </Typography>{\" \"}\n ({currentRelativeTime})\n </Box>\n </Stack>\n <IconButton size=\"small\" aria-label=\"Environment Info\">\n <Box\n component={PiInfo}\n sx={{ fontSize: 16, verticalAlign: \"middle\" }}\n />\n </IconButton>\n </Box>\n </MuiTooltip>\n <MuiDialog open={open} onClose={handleClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle sx={{ display: \"flex\", alignItems: \"center\" }}>\n Environment Information\n <Box sx={{ flexGrow: 1 }} />\n <IconButton size=\"small\" onClick={handleClose}>\n <IoClose />\n </IconButton>\n </DialogTitle>\n <DialogContent>\n <Stack direction=\"column\" spacing={1}>\n {reviewMode ? (\n <Stack direction=\"column\" spacing={0.5}>\n <Typography variant=\"h6\" sx={{ fontSize: \"1rem\" }}>\n Review Information\n </Typography>\n <ul style={{ margin: 0, paddingLeft: \"20px\" }}>\n {reviewInfo.url && (\n <li style={{ marginLeft: \"10px\" }}>\n url:{\" \"}\n <Link\n href={reviewInfo.url}\n target=\"_blank\"\n sx={{ color: \"primary.main\" }}\n >\n {reviewInfo.url} <LuExternalLink />\n </Link>\n </li>\n )}\n {!isEmpty(reviewInfo) && renderInfoEntries(reviewInfo)}\n </ul>\n </Stack>\n ) : (\n <Stack direction=\"column\" spacing={0.5}>\n <Typography variant=\"h6\" sx={{ fontSize: \"1rem\" }}>\n Dev Information\n </Typography>\n <ul style={{ margin: 0, paddingLeft: \"20px\" }}>\n {git && renderInfoEntries(git)}\n </ul>\n </Stack>\n )}\n <Divider />\n {envInfo?.adapterType === \"dbt\" && (\n <Stack direction=\"column\" spacing={0.5}>\n <Typography variant=\"h6\" sx={{ fontSize: \"1rem\" }}>\n DBT\n </Typography>\n <TableContainer\n sx={{ border: 1, borderColor: \"divider\", maxHeight: \"30rem\" }}\n >\n <Table size=\"small\" stickyHeader>\n <TableHead>\n <TableRow>\n <TableCell />\n <TableCell>base</TableCell>\n <TableCell>current</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n <TableRow>\n <TableCell>schema</TableCell>\n <TableCell className=\"no-track-pii-safe\">\n {Array.from(baseSchemas).map((item) => (\n <MuiTooltip\n key={item}\n title={item}\n placement=\"bottom\"\n >\n <div className=\"max-w-72 truncate\">{item}</div>\n </MuiTooltip>\n ))}\n </TableCell>\n <TableCell className=\"no-track-pii-safe\">\n {Array.from(currentSchemas).map((item) => (\n <MuiTooltip\n key={item}\n title={item}\n placement=\"bottom\"\n >\n <div className=\"max-w-72 truncate\">{item}</div>\n </MuiTooltip>\n ))}\n </TableCell>\n </TableRow>\n <TableRow>\n <TableCell>version</TableCell>\n <TableCell>{dbtBase?.dbt_version}</TableCell>\n <TableCell>{dbtCurrent?.dbt_version}</TableCell>\n </TableRow>\n <TableRow>\n <TableCell>timestamp</TableCell>\n <TableCell>{baseTime}</TableCell>\n <TableCell>{currentTime}</TableCell>\n </TableRow>\n </TableBody>\n </Table>\n </TableContainer>\n </Stack>\n )}\n {envInfo?.adapterType === \"sqlmesh\" && (\n <Stack direction=\"column\" spacing={0.5}>\n <Typography variant=\"h6\" sx={{ fontSize: \"1rem\" }}>\n SQLMesh\n </Typography>\n <TableContainer\n sx={{ border: 1, borderColor: \"divider\", maxHeight: \"30rem\" }}\n >\n <Table stickyHeader>\n <TableHead>\n <TableRow>\n <TableCell />\n <TableCell>base</TableCell>\n <TableCell>current</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n <TableRow>\n <TableCell>Environment</TableCell>\n <TableCell className=\"no-track-pii-safe\">\n {envInfo.sqlmesh?.base_env}\n </TableCell>\n <TableCell className=\"no-track-pii-safe\">\n {envInfo.sqlmesh?.current_env}\n </TableCell>\n </TableRow>\n </TableBody>\n </Table>\n </TableContainer>\n </Stack>\n )}\n </Stack>\n </DialogContent>\n <DialogActions>\n <Button color=\"iochmara\" onClick={handleClose}>\n Close\n </Button>\n </DialogActions>\n </MuiDialog>\n </>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Checkbox from \"@mui/material/Checkbox\";\nimport MuiDialog from \"@mui/material/Dialog\";\nimport DialogActions from \"@mui/material/DialogActions\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Stack from \"@mui/material/Stack\";\nimport TextField from \"@mui/material/TextField\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { isAxiosError } from \"axios\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { IoClose } from \"react-icons/io5\";\nimport { LuSave } from \"react-icons/lu\";\nimport { PiPencil } from \"react-icons/pi\";\nimport {\n cacheKeys,\n LOCAL_STORAGE_KEYS,\n rename,\n saveAs,\n useChecks,\n} from \"../../api\";\nimport {\n useLineageGraphContext,\n useRecceInstanceContext,\n} from \"../../contexts\";\nimport { useApiConfig } from \"../../hooks\";\nimport { formatRunDateTime } from \"../run\";\nimport { toaster } from \"../ui\";\n\nconst useRecceToast = () => {\n const toastSuccess = (message: string) => {\n toaster.create({\n description: message,\n type: \"success\",\n duration: 5000,\n closable: true,\n });\n };\n\n const toastError = (message: string, error?: Error) => {\n let errorMessage = message;\n if (error != null) {\n if (isAxiosError<{ detail?: string }>(error)) {\n errorMessage = `${message}. ${String(error.response?.data?.detail)}`;\n } else {\n errorMessage = `${message}. ${error}`;\n }\n }\n\n toaster.create({\n description: errorMessage,\n type: \"error\",\n duration: 5000,\n closable: true,\n });\n };\n\n return { toastSuccess, toastError };\n};\n\nconst useClosePrompt = (prompt: boolean) => {\n useEffect(() => {\n const handleBeforeUnload = (e: BeforeUnloadEvent) => {\n e.preventDefault();\n };\n\n if (prompt) {\n window.addEventListener(\"beforeunload\", handleBeforeUnload);\n }\n\n return () => {\n if (prompt) {\n window.removeEventListener(\"beforeunload\", handleBeforeUnload);\n }\n };\n }, [prompt]);\n};\n\ninterface FilenameState {\n newFileName: string;\n errorMessage?: string;\n modified?: boolean;\n overwriteWithMethod?: \"save\" | \"rename\";\n bypass?: boolean;\n}\n\nexport const Filename = () => {\n const { featureToggles } = useRecceInstanceContext();\n const { fileName, cloudMode, isDemoSite, envInfo } = useLineageGraphContext();\n const { apiClient } = useApiConfig();\n const [modalOpen, setModalOpen] = useState(false);\n const [overwriteOpen, setOverwriteOpen] = useState(false);\n const isStateless = !fileName && !cloudMode && !isDemoSite;\n const { data: checks } = useChecks(isStateless);\n const hasNonPresetChecks =\n checks != undefined &&\n checks.filter((check) => !check.is_preset).length > 0;\n useClosePrompt(isStateless && hasNonPresetChecks);\n\n const [\n { newFileName, errorMessage, modified, overwriteWithMethod, bypass },\n setState,\n ] = useState<FilenameState>({\n newFileName: fileName ?? \"recce_state.json\",\n bypass: false,\n });\n\n const inputRef = useRef<HTMLInputElement>(null);\n const { toastSuccess, toastError } = useRecceToast();\n const queryClient = useQueryClient();\n\n const handleOpen = () => {\n setState({\n newFileName: fileName ?? \"recce_state.json\",\n modified: !fileName,\n bypass: false,\n });\n\n setModalOpen(true);\n };\n\n const handleModalClose = () => setModalOpen(false);\n const handleOverwriteClose = () => setOverwriteOpen(false);\n\n const handleAction = async (\n method: \"save\" | \"rename\",\n overwrite?: boolean,\n ) => {\n if (!newFileName) {\n return;\n }\n\n const bypassOverwrite =\n localStorage.getItem(LOCAL_STORAGE_KEYS.bypassSaveOverwrite) === \"true\";\n\n try {\n if (method === \"save\") {\n await saveAs(\n {\n filename: newFileName,\n overwrite: overwrite ?? bypassOverwrite,\n },\n apiClient,\n );\n } else {\n await rename(\n {\n filename: newFileName,\n overwrite: overwrite ?? bypassOverwrite,\n },\n apiClient,\n );\n }\n toastSuccess(\n method === \"save\"\n ? \"Save file successfully\"\n : \"Rename file successfully\",\n );\n await queryClient.invalidateQueries({ queryKey: cacheKeys.lineage() });\n if (bypass) {\n localStorage.setItem(LOCAL_STORAGE_KEYS.bypassSaveOverwrite, \"true\");\n }\n } catch (error: unknown) {\n if (isAxiosError(error)) {\n if (error.response?.status === 409) {\n setState((s) => ({\n ...s,\n overwriteWithMethod: method,\n }));\n\n setOverwriteOpen(true);\n return;\n }\n }\n toastError(\n method === \"save\" ? \"Save file failed\" : \"Rename file failed\",\n error as Error,\n );\n } finally {\n handleModalClose();\n }\n };\n\n const handleOvewriteBack = () => {\n handleOverwriteClose();\n setModalOpen(true);\n setState((s) => {\n return {\n ...s,\n overwriteWithMethod: undefined,\n };\n });\n };\n\n if (cloudMode || isDemoSite) {\n return <></>;\n }\n\n const titleNewInstance =\n \"New Instance\" + (hasNonPresetChecks ? \" (unsaved)\" : \"\");\n let titleReadOnlyState;\n if (featureToggles.disableSaveToFile && fileName) {\n const generatedAt = envInfo?.stateMetadata?.generated_at;\n const formattedDate = generatedAt\n ? formatRunDateTime(new Date(generatedAt))\n : null;\n titleReadOnlyState = formattedDate\n ? `${fileName} (${formattedDate})`\n : null;\n }\n\n return (\n <>\n <Stack direction=\"row\" alignItems=\"center\" justifyContent=\"center\">\n <Box sx={{ fontWeight: 600 }}>\n {titleReadOnlyState ?? fileName ?? titleNewInstance}\n </Box>\n {!featureToggles.disableSaveToFile && (\n <MuiTooltip\n title={fileName ? \"Change Filename\" : \"Save\"}\n enterDelay={1000}\n >\n <IconButton\n onClick={handleOpen}\n aria-label={fileName ? \"Change Filename\" : \"Save\"}\n size=\"small\"\n >\n <Box\n component={fileName ? PiPencil : LuSave}\n sx={{ fontSize: 16, verticalAlign: \"middle\" }}\n />\n </IconButton>\n </MuiTooltip>\n )}\n </Stack>\n <MuiDialog open={modalOpen} onClose={handleModalClose}>\n <DialogTitle sx={{ display: \"flex\", alignItems: \"center\" }}>\n {fileName ? \"Change Filename\" : \"Save File\"}\n <Box sx={{ flexGrow: 1 }} />\n <IconButton size=\"small\" onClick={handleModalClose}>\n <IoClose />\n </IconButton>\n </DialogTitle>\n <DialogContent\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n >\n <TextField\n inputRef={inputRef}\n value={newFileName}\n label=\"File name\"\n placeholder=\"Enter filename\"\n error={!!errorMessage}\n helperText={errorMessage}\n fullWidth\n size=\"small\"\n sx={{ mt: 1 }}\n onChange={(e) => {\n const value = e.target.value;\n let newErrorMessage: string | undefined = undefined;\n\n if (!value) {\n newErrorMessage = \"Filename cannot be empty.\";\n } else if (!value.endsWith(\".json\")) {\n newErrorMessage = \"Filename must end with .json.\";\n } else if (!/^[a-zA-Z0-9 _-]+\\.json$/.test(value)) {\n newErrorMessage =\n \"Invalid filename. Only alphanumeric, space, _ and - are allowed.\";\n } else if (fileName && value === fileName) {\n newErrorMessage = \"Filename is the same as the current one.\";\n }\n\n setState((s) => {\n return {\n ...s,\n modified: true,\n newFileName: value,\n errorMessage: newErrorMessage,\n };\n });\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n if (errorMessage) {\n return;\n }\n\n if (!fileName) {\n void handleAction(\"save\");\n } else {\n void handleAction(\"rename\");\n }\n } else if (e.key === \"Escape\") {\n handleModalClose();\n }\n }}\n />\n </DialogContent>\n <DialogActions sx={{ gap: \"5px\" }}>\n <Button\n size=\"small\"\n color={fileName ? \"inherit\" : \"iochmara\"}\n variant=\"contained\"\n onClick={async () => {\n await handleAction(\"save\");\n }}\n disabled={!newFileName || !!errorMessage || !modified}\n >\n {fileName ? \"Save as New File\" : \"Confirm\"}\n </Button>\n {fileName && (\n <Button\n size=\"small\"\n color=\"iochmara\"\n variant=\"contained\"\n onClick={async () => {\n await handleAction(\"rename\");\n }}\n disabled={!newFileName || !!errorMessage || !modified}\n >\n Rename\n </Button>\n )}\n </DialogActions>\n </MuiDialog>\n <MuiDialog open={overwriteOpen} onClose={handleOverwriteClose}>\n <DialogTitle sx={{ display: \"flex\", alignItems: \"center\" }}>\n Overwrite File?\n <Box sx={{ flexGrow: 1 }} />\n <IconButton size=\"small\" onClick={handleOverwriteClose}>\n <IoClose />\n </IconButton>\n </DialogTitle>\n <DialogContent\n sx={{\n borderTop: \"solid 1px\",\n borderBottom: \"solid 1px\",\n borderColor: \"divider\",\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n >\n <Typography sx={{ fontSize: \"12pt\" }}>\n {overwriteWithMethod === \"save\"\n ? \"Saving a file with this name will overwrite the existing file. Are you sure you wish to continue?\"\n : \"Renaming the file with this name will overwrite the existing file. Are you sure you wish to continue?\"}\n </Typography>\n\n <FormControlLabel\n control={\n <Checkbox\n size=\"small\"\n checked={bypass}\n onChange={(e) => {\n setState((s) => ({ ...s, bypass: e.target.checked }));\n }}\n />\n }\n label={\n <Typography sx={{ fontWeight: \"bold\", pt: \"8px\" }}>\n Don&apos;t show this again\n </Typography>\n }\n />\n </DialogContent>\n <DialogActions sx={{ gap: \"5px\" }}>\n <Button variant=\"outlined\" onClick={handleOvewriteBack} size=\"small\">\n Back\n </Button>\n <Button\n size=\"small\"\n color=\"iochmara\"\n variant=\"contained\"\n onClick={() => {\n if (!overwriteWithMethod) {\n return;\n }\n\n void handleAction(overwriteWithMethod, true);\n handleOverwriteClose();\n }}\n >\n Overwrite\n </Button>\n </DialogActions>\n </MuiDialog>\n </>\n );\n};\n","import Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport { format } from \"date-fns\";\nimport saveAs from \"file-saver\";\nimport { PiExport } from \"react-icons/pi\";\nimport { exportState } from \"../../api\";\nimport { useRecceInstanceContext } from \"../../contexts\";\nimport { useApiConfig } from \"../../hooks\";\nimport { trackStateAction } from \"../../lib/api/track\";\nimport { toaster } from \"../ui\";\n\nexport function StateExporter() {\n const { featureToggles } = useRecceInstanceContext();\n const { apiClient } = useApiConfig();\n\n const handleExport = async () => {\n try {\n const jsonData = await exportState(apiClient);\n const jsonString = JSON.stringify(jsonData, null, 2);\n const blob = new Blob([jsonString], { type: \"application/json\" });\n\n const now = new Date();\n const fileName = `recce-state-${format(now, \"yyyy-MM-dd-HH-mm-ss\")}.json`;\n\n saveAs(blob, fileName);\n } catch (error) {\n console.error(\"Export failed\", error);\n toaster.create({\n title: \"Export failed\",\n description: String(error),\n type: \"error\",\n duration: 5000,\n closable: true,\n });\n }\n };\n\n return (\n <MuiTooltip title=\"Export\">\n <IconButton\n size=\"small\"\n aria-label=\"Export state\"\n onClick={async () => {\n await handleExport();\n trackStateAction({ name: \"export\" });\n }}\n disabled={featureToggles.disableExportStateFile}\n >\n <Box\n component={PiExport}\n sx={{ verticalAlign: \"middle\", width: \"16px\", height: \"16px\" }}\n />\n </IconButton>\n </MuiTooltip>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { useEffect, useState } from \"react\";\nimport { PiCheckCircle, PiCopy } from \"react-icons/pi\";\nimport { TbCloudUpload } from \"react-icons/tb\";\nimport { useCopyToClipboard, useInterval } from \"usehooks-ts\";\nimport { useRecceInstanceContext } from \"../../contexts\";\nimport { useClipBoardToast, useRecceShareStateContext } from \"../../hooks\";\nimport { trackShareState } from \"../../lib/api/track\";\nimport AuthModal from \"./AuthModal\";\n\nconst LOADING_MESSAGES = [\n \"Processing...\", // 0-30s\n \"Still processing, please wait...\", // 30-60s\n \"Almost there, thanks for your patience...\", // 60s+\n];\n\nexport function TopLevelShare() {\n const { successToast, failToast } = useClipBoardToast();\n const [, copyToClipboard] = useCopyToClipboard();\n const { authed } = useRecceInstanceContext();\n const { shareUrl, isLoading, error, handleShareClick } =\n useRecceShareStateContext();\n const [showModal, setShowModal] = useState(false);\n const [messageIndex, setMessageIndex] = useState(0);\n const [prevIsLoading, setPrevIsLoading] = useState(isLoading);\n\n // Reset message index when loading starts (during render)\n if (isLoading !== prevIsLoading) {\n setPrevIsLoading(isLoading);\n if (isLoading) {\n // Loading just started, reset to 0\n setMessageIndex(0);\n }\n }\n\n // Increment message index every 30 seconds while loading\n useInterval(\n () => {\n setMessageIndex((prev) =>\n Math.min(prev + 1, LOADING_MESSAGES.length - 1),\n );\n },\n isLoading ? 30000 : null,\n );\n\n // Show error toast when sharing fails\n useEffect(() => {\n if (error) {\n failToast(\"Failed to share state\", error);\n }\n }, [error, failToast]);\n\n const handleCopy = async () => {\n try {\n await copyToClipboard(String(shareUrl));\n successToast(\"Copied the link to clipboard\");\n } catch (error) {\n failToast(\"Failed to copy the link\", error);\n }\n };\n\n if (!authed) {\n return (\n <Stack direction=\"row\" sx={{ flex: 1, alignItems: \"center\" }}>\n <Button\n size=\"xsmall\"\n color=\"neutral\"\n variant=\"outlined\"\n onClick={() => {\n setShowModal(true);\n }}\n startIcon={<TbCloudUpload />}\n >\n Share\n </Button>\n {showModal && (\n <AuthModal\n parentOpen={showModal}\n handleParentClose={setShowModal}\n ignoreCookie\n variant=\"enable-share\"\n />\n )}\n </Stack>\n );\n }\n\n return (\n <Stack direction=\"row\" sx={{ flex: 1, alignItems: \"center\", gap: \"5px\" }}>\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<TbCloudUpload />}\n endIcon={\n shareUrl ? (\n <Box component={PiCheckCircle} sx={{ color: \"success.main\" }} />\n ) : undefined\n }\n onClick={async () => {\n await handleShareClick();\n trackShareState({ name: \"create\" });\n }}\n disabled={isLoading}\n >\n {isLoading ? \"Sharing...\" : \"Share\"}\n </Button>\n {isLoading && (\n <Typography sx={{ fontSize: 14, color: \"grey.500\" }}>\n {LOADING_MESSAGES[messageIndex]}\n </Typography>\n )}\n <Stack direction=\"row\" spacing={0.5} alignItems=\"center\">\n {shareUrl && (\n <>\n <Box\n sx={{\n overflowX: \"auto\",\n whiteSpace: \"nowrap\",\n maxWidth: \"350px\",\n }}\n >\n <Typography sx={{ fontSize: 14 }}>{shareUrl}</Typography>\n </Box>\n <IconButton\n size=\"small\"\n aria-label=\"Copy the share URL\"\n onClick={async () => {\n await handleCopy();\n trackShareState({ name: \"copy\" });\n }}\n >\n <PiCopy />\n </IconButton>\n </>\n )}\n </Stack>\n </Stack>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport MuiDialog from \"@mui/material/Dialog\";\nimport DialogActions from \"@mui/material/DialogActions\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Radio from \"@mui/material/Radio\";\nimport RadioGroup from \"@mui/material/RadioGroup\";\nimport Stack from \"@mui/material/Stack\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { usePathname, useRouter } from \"next/navigation\";\nimport React, { useCallback, useState } from \"react\";\nimport { IoClose, IoSync } from \"react-icons/io5\";\nimport { PiInfo } from \"react-icons/pi\";\nimport {\n cacheKeys,\n isStateSyncing,\n type SyncStateInput,\n syncState,\n} from \"../../api\";\nimport { useRecceInstanceInfo, useRouteConfig } from \"../../contexts\";\nimport { useApiConfig } from \"../../hooks\";\nimport { toaster } from \"../ui\";\n\nfunction isCheckDetailPage(href: string): boolean {\n const pattern =\n /^\\/checks\\/([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/;\n return pattern.test(href);\n}\n\nexport function StateSpinner() {\n return (\n <MuiTooltip title=\"Syncing\">\n <Box sx={{ mx: \"10px\" }}>\n <CircularProgress size={20} />\n </Box>\n </MuiTooltip>\n );\n}\n\nexport function StateSynchronizer() {\n const [isSyncing, setSyncing] = useState(false);\n const queryClient = useQueryClient();\n const { apiClient } = useApiConfig();\n const router = useRouter();\n const pathname = usePathname();\n const { basePath } = useRouteConfig();\n const [open, setOpen] = useState(false);\n const [syncOption, setSyncOption] = useState<\n \"overwrite\" | \"revert\" | \"merge\" | \"\"\n >(\"\");\n const { data: instanceInfo } = useRecceInstanceInfo();\n\n const handleClose = () => setOpen(false);\n\n const handleSync = useCallback(\n async (input: SyncStateInput) => {\n setOpen(false);\n setSyncing(true);\n\n const response = await syncState(input, apiClient);\n if (response.status === \"conflict\") {\n setOpen(true);\n setSyncing(false);\n return;\n }\n\n while (await isStateSyncing(apiClient)) {\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n\n toaster.create({\n description: \"Sync Completed\",\n type: \"success\",\n duration: 5000,\n closable: true,\n });\n\n setSyncing(false);\n setSyncOption(\"\");\n\n await queryClient.invalidateQueries({ queryKey: cacheKeys.lineage() });\n await queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });\n await queryClient.invalidateQueries({ queryKey: cacheKeys.runs() });\n\n if (isCheckDetailPage(pathname)) {\n router.push(`${basePath}/checks`);\n }\n },\n [queryClient, pathname, apiClient, router.push, basePath],\n );\n\n if (isSyncing) return <StateSpinner />;\n return (\n <>\n <MuiTooltip title=\"Sync with Cloud\">\n <IconButton\n size=\"small\"\n aria-label=\"Sync state\"\n onClick={() =>\n handleSync(instanceInfo?.session_id ? { method: \"merge\" } : {})\n }\n >\n <Box\n component={IoSync}\n sx={{ fontSize: 16, verticalAlign: \"middle\" }}\n />\n </IconButton>\n </MuiTooltip>\n <MuiDialog open={open} onClose={handleClose}>\n <DialogTitle\n sx={{ display: \"flex\", alignItems: \"center\", fontWeight: \"bold\" }}\n >\n Sync with Cloud\n <Box sx={{ flexGrow: 1 }} />\n <IconButton size=\"small\" onClick={handleClose}>\n <IoClose />\n </IconButton>\n </DialogTitle>\n <DialogContent>\n <Typography>\n New changes have been detected in the cloud. Please choose a method\n to sync your state\n </Typography>\n <Box sx={{ mt: \"5px\" }}>\n <RadioGroup\n value={syncOption}\n onChange={(e) => {\n setSyncOption(\n e.target.value as \"merge\" | \"overwrite\" | \"revert\",\n );\n }}\n >\n <Stack direction=\"column\">\n {/* Merge */}\n <FormControlLabel\n value=\"merge\"\n control={<Radio />}\n label={\n <Stack direction=\"row\" alignItems=\"center\">\n Merge\n <MuiTooltip title=\"This will merge the local and remote states.\">\n <Box\n component={PiInfo}\n sx={{ ml: 2, cursor: \"pointer\" }}\n />\n </MuiTooltip>\n </Stack>\n }\n />\n\n {/* Overwrite */}\n <FormControlLabel\n value=\"overwrite\"\n control={<Radio />}\n label={\n <Stack direction=\"row\" alignItems=\"center\">\n Overwrite\n <MuiTooltip title=\"This will overwrite the remote state file with the local state.\">\n <Box\n component={PiInfo}\n sx={{ ml: 2, cursor: \"pointer\" }}\n />\n </MuiTooltip>\n </Stack>\n }\n />\n\n {/* Revert */}\n <FormControlLabel\n value=\"revert\"\n control={<Radio />}\n label={\n <Stack direction=\"row\" alignItems=\"center\">\n Revert\n <MuiTooltip title=\"This will discard local changes and revert to the cloud state.\">\n <Box\n component={PiInfo}\n sx={{ ml: 2, cursor: \"pointer\" }}\n />\n </MuiTooltip>\n </Stack>\n }\n />\n </Stack>\n </RadioGroup>\n </Box>\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} sx={{ mr: 1 }}>\n Cancel\n </Button>\n <Button\n color=\"iochmara\"\n variant=\"contained\"\n onClick={() => handleSync({ method: syncOption || undefined })}\n disabled={!syncOption}\n >\n Sync\n </Button>\n </DialogActions>\n </MuiDialog>\n </>\n );\n}\n","\"use client\";\n\n\"use client\";\n\nimport Box from \"@mui/material/Box\";\nimport Tab from \"@mui/material/Tab\";\nimport MuiTabs from \"@mui/material/Tabs\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport NextLink from \"next/link\";\nimport { usePathname } from \"next/navigation\";\nimport React, { type ReactNode, useEffect, useMemo, useRef } from \"react\";\nimport { type Check, cacheKeys, listChecks } from \"../../api\";\nimport {\n useLineageGraphContext,\n useRecceInstanceContext,\n useRecceServerFlag,\n} from \"../../contexts\";\nimport { useApiConfig } from \"../../hooks/useApiConfig\";\nimport { trackNavigation } from \"../../lib/api/track\";\nimport { EnvInfo } from \"./EnvInfo\";\nimport { Filename } from \"./Filename\";\nimport { StateExporter } from \"./StateExporter\";\nimport { TopLevelShare } from \"./StateSharing\";\nimport { StateSynchronizer } from \"./StateSynchronizer\";\n\n/**\n * Route configuration for tabs\n */\nconst ROUTE_CONFIG = [\n { path: \"/lineage\", name: \"Lineage\" },\n { path: \"/query\", name: \"Query\" },\n { path: \"/checks\", name: \"Checklist\" },\n] as const;\n\ninterface TabBadgeProps<T> {\n queryKey: string[];\n fetchCallback: () => Promise<T>;\n selectCallback?: (data: T) => number;\n}\n\nfunction TabBadge<T>({\n queryKey,\n fetchCallback,\n selectCallback,\n}: TabBadgeProps<T>): ReactNode {\n const {\n data: count,\n isLoading,\n error,\n } = useQuery({\n queryKey: queryKey,\n queryFn: fetchCallback,\n select: selectCallback,\n });\n\n if (isLoading || error || count === 0) {\n return <></>;\n }\n\n return (\n <Box\n bgcolor=\"brand.main\"\n display=\"flex\"\n justifyContent=\"center\"\n alignItems=\"center\"\n p={1}\n borderRadius=\"100%\"\n color=\"white\"\n fontWeight={700}\n fontSize=\"0.75rem\"\n >\n <span>{count}</span>\n </Box>\n );\n}\n\nfunction ChecklistBadge(): ReactNode {\n const { apiClient } = useApiConfig();\n return (\n <TabBadge<Check[]>\n queryKey={cacheKeys.checks()}\n fetchCallback={() => listChecks(apiClient)}\n selectCallback={(checks: Check[]) => {\n return checks.filter((check) => !check.is_checked).length;\n }}\n />\n );\n}\n\n// NavBar component with Next.js Link navigation\nexport const NavBarOss = () => {\n const pathname = usePathname();\n const { isDemoSite, isLoading, cloudMode } = useLineageGraphContext();\n const { featureToggles } = useRecceInstanceContext();\n const { data: flag, isLoading: isFlagLoading } = useRecceServerFlag();\n\n // Track navigation changes with previous pathname\n const prevPathnameRef = useRef<string | null>(null);\n useEffect(() => {\n if (prevPathnameRef.current && prevPathnameRef.current !== pathname) {\n trackNavigation({ from: prevPathnameRef.current, to: pathname });\n }\n prevPathnameRef.current = pathname;\n }, [pathname]);\n\n // Get current tab value from pathname\n const currentTab = useMemo(() => {\n if (pathname.startsWith(\"/checks\")) return \"/checks\";\n if (pathname.startsWith(\"/query\")) return \"/query\";\n if (pathname.startsWith(\"/runs\")) return \"/runs\";\n return \"/lineage\";\n }, [pathname]);\n\n return (\n <Box sx={{ borderBottom: \"1px solid lightgray\", px: \"12px\" }}>\n {/* Grid layout outside Tabs so MUI Tabs can find tab children */}\n <Box\n sx={{\n display: \"grid\",\n gridTemplateColumns: \"1fr auto 1fr\",\n width: \"100%\",\n alignItems: \"center\",\n }}\n >\n {/* Left section: Tabs */}\n <MuiTabs\n value={currentTab}\n sx={{ borderBottom: \"none\", minHeight: \"auto\" }}\n >\n {ROUTE_CONFIG.map(({ path, name }) => {\n const disable = name === \"Query\" && flag?.single_env_onboarding;\n\n // Don't render hidden tabs\n if (disable) {\n return null;\n }\n\n if (name === \"Checklist\" && ChecklistBadge) {\n return (\n <Tab\n key={path}\n value={path}\n disabled={isLoading || isFlagLoading}\n sx={{\n p: 0,\n }}\n label={\n <Box\n sx={{ display: \"flex\", alignItems: \"center\", gap: \"4px\" }}\n >\n <NextLink\n href={path}\n style={{\n textDecoration: \"none\",\n color: \"inherit\",\n padding: \"0.875rem 1.1875rem\",\n display: \"flex\",\n gap: 3,\n alignItems: \"center\",\n }}\n >\n {name} <ChecklistBadge />\n </NextLink>\n </Box>\n }\n />\n );\n }\n\n return (\n <Tab\n key={path}\n value={path}\n disabled={isLoading || isFlagLoading}\n sx={{\n p: 0,\n }}\n label={\n <Box\n sx={{ display: \"flex\", alignItems: \"center\", gap: \"4px\" }}\n >\n <NextLink\n href={path}\n style={{\n textDecoration: \"none\",\n color: \"inherit\",\n padding: \"0.875rem 1.1875rem\",\n }}\n >\n {name}\n </NextLink>\n </Box>\n }\n />\n );\n })}\n </MuiTabs>\n\n {/* Center section: Filename and TopLevelShare */}\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n justifyContent: \"center\",\n }}\n >\n {!isLoading && !isDemoSite && <Filename />}\n {!isLoading &&\n !isDemoSite &&\n !flag?.single_env_onboarding &&\n !featureToggles.disableShare && <TopLevelShare />}\n </Box>\n\n {/* Right section: EnvInfo, StateSynchronizer, StateExporter */}\n {!isLoading && (\n <Box\n sx={{\n display: \"flex\",\n justifyContent: \"right\",\n alignItems: \"center\",\n mr: \"8px\",\n }}\n >\n <EnvInfo />\n {cloudMode && <StateSynchronizer />}\n <StateExporter />\n </Box>\n )}\n </Box>\n </Box>\n );\n};\n","\"use client\";\n\nimport Badge from \"@mui/material/Badge\";\nimport Box from \"@mui/material/Box\";\nimport { IoWarning } from \"react-icons/io5\";\nimport { useIdleTimeout } from \"../../contexts\";\nimport { formatDuration } from \"../../utils\";\n\n/**\n * Warning threshold in seconds - badge appears when remaining time is below this\n */\nconst WARNING_THRESHOLD_SECONDS = 60;\n\n/**\n * Badge component that displays idle timeout warning countdown\n * Only shows when remaining time is below the warning threshold\n * Styled as a warning indicator to draw user attention\n */\nexport function IdleTimeoutBadge() {\n const { remainingSeconds, isEnabled } = useIdleTimeout();\n\n // Don't render if idle timeout is not configured\n if (!isEnabled || remainingSeconds === null) {\n return null;\n }\n\n // Only show when below warning threshold\n if (remainingSeconds > WARNING_THRESHOLD_SECONDS) {\n return null;\n }\n\n return (\n <Badge\n color=\"warning\"\n variant=\"standard\"\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 1,\n fontSize: \"0.75rem\",\n mr: 2,\n }}\n >\n <Box component={IoWarning} sx={{ display: \"inline-flex\" }} />\n Idle timeout: {formatDuration(remainingSeconds, \"compact\")}\n </Badge>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Link from \"@mui/material/Link\";\nimport Typography from \"@mui/material/Typography\";\nimport React, { useEffect, useMemo } from \"react\";\nimport { useVersionNumber } from \"../../api\";\nimport { toaster } from \"../ui\";\n\nexport const RecceVersionBadgeOss = () => {\n const { version, latestVersion } = useVersionNumber();\n const versionFormatRegex = useMemo(\n () => new RegExp(\"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+$\"),\n [],\n );\n\n useEffect(() => {\n if (versionFormatRegex.test(version) && version !== latestVersion) {\n const storageKey = \"recce-update-toast-shown\";\n const hasShownForThisVersion = sessionStorage.getItem(storageKey);\n if (hasShownForThisVersion) {\n return;\n }\n // Defer toast creation to next tick to avoid React's flushSync error\n // This prevents \"flushSync called from inside lifecycle method\" when\n // the toast library tries to immediately update DOM during render cycle\n setTimeout(() => {\n toaster.create({\n id: \"recce-update-available\", // Fixed ID prevents duplicates\n title: \"Update available\",\n description: (\n <span>\n A new version of Recce (v{latestVersion}) is available.\n <br />\n Please run{\" \"}\n <Box\n component=\"code\"\n sx={{\n bgcolor: \"grey.200\",\n px: 0.5,\n py: 0.25,\n borderRadius: 0.5,\n fontFamily: \"monospace\",\n fontSize: \"0.875em\",\n }}\n >\n pip install --upgrade recce\n </Box>{\" \"}\n to update Recce.\n <br />\n <Link\n sx={{\n color: \"primary.main\",\n fontWeight: \"bold\",\n \"&:hover\": { textDecoration: \"underline\" },\n }}\n href={`https://github.com/DataRecce/recce/releases/tag/v${latestVersion}`}\n target=\"_blank\"\n >\n Click here to view the detail of latest release\n </Link>\n </span>\n ),\n duration: 60 * 1000,\n closable: true,\n });\n sessionStorage.setItem(storageKey, \"true\");\n }, 0);\n }\n }, [version, latestVersion, versionFormatRegex]);\n\n if (!versionFormatRegex.test(version)) {\n // If the version is not in the format of x.y.z, don't apply\n return (\n <Typography\n component=\"span\"\n sx={{\n fontSize: \"sm\",\n color: \"rgba(255,255,255,0.8)\",\n textTransform: \"uppercase\",\n borderWidth: 1,\n px: 1,\n borderRadius: 0.75,\n }}\n >\n {version}\n </Typography>\n );\n }\n\n // Link to the release page on GitHub if the version is in the format of x.y.z\n return (\n <Link\n href={`https://github.com/DataRecce/recce/releases/tag/v${version}`}\n sx={{\n \"&:hover\": { textDecoration: \"none\" },\n fontSize: \"sm\",\n color: \"rgba(255,255,255,0.8)\",\n textTransform: \"uppercase\",\n borderWidth: 1,\n px: 1,\n borderRadius: 0.75,\n }}\n target=\"_blank\"\n >\n {version}\n </Link>\n );\n};\n","\"use client\";\n\nimport Badge from \"@mui/material/Badge\";\nimport Box from \"@mui/material/Box\";\nimport Link from \"@mui/material/Link\";\nimport Stack from \"@mui/material/Stack\";\nimport { useTheme } from \"@mui/material/styles\";\nimport Typography from \"@mui/material/Typography\";\nimport React, { useState } from \"react\";\nimport { IconType } from \"react-icons\";\nimport { FaGithub, FaQuestionCircle, FaSlack } from \"react-icons/fa\";\nimport { VscGitPullRequest } from \"react-icons/vsc\";\nimport {\n useLineageGraphContext,\n useRecceInstanceContext,\n} from \"../../contexts\";\nimport { colors } from \"../../theme\";\nimport { IdleTimeoutBadge } from \"../timeout/IdleTimeoutBadge\";\nimport AuthModal from \"./AuthModal\";\nimport AvatarDropdown from \"./AvatarDropdown\";\nimport { DisplayModeToggleOss as DisplayModeToggle } from \"./DisplayModeToggleOss\";\nimport { RecceVersionBadgeOss as RecceVersionBadge } from \"./RecceVersionBadgeOss\";\n\ninterface LinkIconProps {\n icon: IconType;\n href: string;\n sx?: object;\n}\n\nfunction LinkIcon({ icon: IconComponent, href, sx, ...props }: LinkIconProps) {\n const theme = useTheme();\n return (\n <Link\n sx={{ height: \"20px\", color: \"common.white\", ...sx }}\n href={href}\n target=\"_blank\"\n {...props}\n >\n <IconComponent\n style={{ color: theme.palette.common.white, width: 20, height: 20 }}\n />\n </Link>\n );\n}\n\nexport const TopBarOss = () => {\n const { reviewMode, isDemoSite, envInfo, cloudMode } =\n useLineageGraphContext();\n const { featureToggles, authed } = useRecceInstanceContext();\n const { url: prURL, id: prID } = envInfo?.pullRequest ?? {};\n const demoPrId = prURL ? prURL.split(\"/\").pop() : null;\n const brandLink =\n cloudMode || authed\n ? \"https://cloud.datarecce.io/\"\n : \"https://reccehq.com/\";\n const [showModal, setShowModal] = useState(false);\n\n return (\n <Box\n sx={{\n display: \"flex\",\n gap: \"10px\",\n minHeight: \"40px\",\n alignItems: \"center\",\n bgcolor: colors.brand[400],\n }}\n >\n <Link\n href={brandLink}\n target=\"_blank\"\n sx={{ \"&:hover\": { textDecoration: \"none\" } }}\n >\n <Box sx={{ display: \"flex\", gap: \"10px\", alignItems: \"center\" }}>\n <Box\n component=\"img\"\n sx={{ width: 20, height: 20, ml: \"18px\" }}\n src=\"/logo/recce-logo-white.png\"\n alt=\"recce-logo-white\"\n />\n <Typography\n variant=\"h4\"\n sx={{\n fontFamily: '\"Montserrat\", sans-serif',\n color: \"common.white\",\n fontSize: \"1.25rem\",\n }}\n >\n RECCE\n </Typography>\n </Box>\n </Link>\n <DisplayModeToggle />\n <RecceVersionBadge />\n {(featureToggles.mode ?? reviewMode) && (\n <Badge\n sx={{\n fontSize: \"0.875rem\",\n color: \"rgba(255,255,255,0.8)\",\n textTransform: \"uppercase\",\n borderWidth: 1,\n px: 1,\n borderRadius: 0.75,\n borderColor: \"rgba(255,255,255,0.8)\",\n }}\n >\n {featureToggles.mode ?? \"review mode\"}\n </Badge>\n )}\n {cloudMode && prID && (\n <Badge\n sx={{\n fontSize: \"0.875rem\",\n color: \"rgba(255,255,255,0.8)\",\n textTransform: \"uppercase\",\n borderWidth: 1,\n px: 1,\n borderRadius: 0.75,\n borderColor: \"rgba(255,255,255,0.8)\",\n }}\n >\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n <Box>cloud mode</Box>\n <Box\n sx={{\n borderLeft: \"1px solid rgba(255,255,255,0.8)\",\n pl: \"8px\",\n }}\n >\n <Link\n href={prURL}\n sx={{ \"&:hover\": { textDecoration: \"none\" } }}\n target=\"_blank\"\n >\n <VscGitPullRequest\n style={{\n color: \"rgba(255,255,255,0.8)\",\n width: 12,\n height: 12,\n marginRight: 2,\n display: \"inline\",\n verticalAlign: \"middle\",\n }}\n />\n <Typography\n component=\"span\"\n sx={{ color: \"rgba(255,255,255,0.8)\", display: \"inline\" }}\n >{`#${String(prID)}`}</Typography>\n </Link>\n </Box>\n </Stack>\n </Badge>\n )}\n {isDemoSite && prURL && demoPrId && (\n <Badge\n sx={{\n fontSize: \"0.875rem\",\n color: \"rgba(255,255,255,0.8)\",\n textTransform: \"uppercase\",\n borderWidth: 1,\n px: 1,\n borderRadius: 0.75,\n borderColor: \"rgba(255,255,255,0.8)\",\n }}\n >\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n <Box>demo mode</Box>\n <Box\n sx={{\n borderLeft: \"1px solid rgba(255,255,255,0.8)\",\n pl: \"8px\",\n }}\n >\n <Link\n href={prURL}\n sx={{ \"&:hover\": { textDecoration: \"none\" } }}\n target=\"_blank\"\n >\n <VscGitPullRequest\n style={{\n color: \"rgba(255,255,255,0.8)\",\n width: 12,\n height: 12,\n marginRight: 2,\n display: \"inline\",\n verticalAlign: \"middle\",\n }}\n />\n <Typography\n component=\"span\"\n sx={{ color: \"rgba(255,255,255,0.8)\", display: \"inline\" }}\n >{`#${demoPrId}`}</Typography>\n </Link>\n </Box>\n </Stack>\n </Badge>\n )}\n <Box sx={{ flex: 1 }} />\n\n {(isDemoSite || featureToggles.mode === \"read only\") && (\n <>\n <LinkIcon icon={FaGithub} href=\"https://github.com/DataRecce/recce\" />\n <LinkIcon\n icon={FaSlack}\n href=\"https://getdbt.slack.com/archives/C05C28V7CPP\"\n />\n <LinkIcon\n sx={{ mr: 2 }}\n icon={FaQuestionCircle}\n href=\"https://docs.datarecce.io\"\n />\n </>\n )}\n {!isDemoSite && featureToggles.mode !== \"read only\" && (\n <>\n <IdleTimeoutBadge />\n {authed || cloudMode ? (\n <Box sx={{ mr: 2 }}>\n <AvatarDropdown />\n </Box>\n ) : (\n <>\n <Box\n component=\"button\"\n sx={{\n color: \"common.white\",\n fontSize: \"0.875rem\",\n fontWeight: 600,\n bgcolor: \"brand.700\",\n borderRadius: 1,\n px: 3,\n py: 1,\n mr: 2,\n cursor: \"pointer\",\n border: \"none\",\n }}\n onClick={() => {\n setShowModal(true);\n }}\n >\n Connect to Cloud\n </Box>\n {showModal && (\n <AuthModal\n parentOpen={showModal}\n handleParentClose={setShowModal}\n ignoreCookie\n variant=\"user-profile\"\n />\n )}\n </>\n )}\n </>\n )}\n </Box>\n );\n};\n","/**\n * MainLayout - Handles parallel route visibility and main app structure\n *\n * This component manages the visibility of the @lineage parallel route\n * while keeping it mounted to preserve React state (React Flow graph state, etc.)\n */\n\n\"use client\";\n\nimport \"@fontsource/montserrat/800.css\";\nimport Box from \"@mui/material/Box\";\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport { usePathname } from \"next/navigation\";\nimport React, { type ReactNode, Suspense, useEffect } from \"react\";\nimport {\n useLineageGraphContext,\n useRecceActionContext,\n useRecceInstanceContext,\n useRecceServerFlag,\n useRouteConfig,\n} from \"../../contexts\";\nimport { useIsDark } from \"../../hooks/useIsDark\";\nimport { trackInit } from \"../../lib/api/track\";\nimport { RunListOss, RunResultPaneOss as RunResultPane } from \"../run\";\nimport { HSplit, VSplit } from \"../ui\";\nimport AuthModal from \"./AuthModal\";\nimport { NavBarOss as NavBar } from \"./NavBarOss\";\nimport { TopBarOss as TopBar } from \"./TopBarOss\";\n\ninterface MainLayoutProps {\n children: ReactNode;\n /** Parallel route slot from @lineage */\n lineage: ReactNode;\n}\n\nfunction MainContentLoading(): ReactNode {\n return (\n <Box\n sx={{\n display: \"flex\",\n height: \"100%\",\n alignItems: \"center\",\n justifyContent: \"center\",\n contain: \"size\",\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n }}\n >\n <CircularProgress size={48} />\n </Box>\n </Box>\n );\n}\n\nexport function MainLayout({ children, lineage }: MainLayoutProps) {\n const pathname = usePathname();\n const { isDemoSite, isLoading, isCodespace } = useLineageGraphContext();\n const { featureToggles } = useRecceInstanceContext();\n\n // Determine if lineage route is active (handle trailing slashes)\n const normalizedPath = pathname.replace(/\\/$/, \"\") || \"/\";\n const isLineageRoute =\n normalizedPath === \"/lineage\" || normalizedPath === \"/\";\n\n useEffect(() => {\n trackInit();\n }, []);\n\n return (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100vh\",\n overflow: \"hidden\",\n }}\n >\n <TopBar />\n <NavBar />\n <Main isLineageRoute={isLineageRoute} lineage={lineage}>\n {children}\n </Main>\n {!isLoading &&\n !isDemoSite &&\n !isCodespace &&\n featureToggles.mode === null && <AuthModal />}\n </Box>\n );\n}\n\n// Main content area with parallel route handling\ninterface MainProps {\n children: ReactNode;\n lineage: ReactNode;\n isLineageRoute: boolean;\n /** Disable internal history panel (RunListOss) - cloud uses its own */\n disableInternalHistory?: boolean;\n}\n\nexport function Main({\n children,\n lineage,\n isLineageRoute,\n disableInternalHistory = false,\n}: MainProps) {\n const { isRunResultOpen, isHistoryOpen, closeRunResult } =\n useRecceActionContext();\n const { basePath } = useRouteConfig();\n const { data: flag } = useRecceServerFlag();\n const pathname = usePathname();\n const isDark = useIsDark();\n\n const _isRunResultOpen =\n isRunResultOpen && !pathname.startsWith(`${basePath}/checks`);\n // When disableInternalHistory is true, always hide internal history panel\n // Cloud mode uses its own RunHistoryDrawer instead\n const _isHistoryOpen = disableInternalHistory\n ? false\n : isHistoryOpen && !pathname.startsWith(`${basePath}/checks`);\n\n return (\n <HSplit\n sizes={[0, 100]}\n minSize={_isHistoryOpen ? 300 : 0}\n gutterSize={_isHistoryOpen ? 5 : 0}\n style={{ height: \"100%\" }}\n >\n {/* suppressHydrationWarning: react-split adds inline styles after mount */}\n <Box style={{ contain: \"size\" }} suppressHydrationWarning>\n {_isHistoryOpen && <RunListOss />}\n </Box>\n <VSplit\n sizes={_isRunResultOpen ? [50, 50] : [100, 0]}\n minSize={_isRunResultOpen ? 100 : 0}\n gutterSize={_isRunResultOpen ? 5 : 0}\n style={{ flex: \"1\", contain: \"size\" }}\n >\n <Suspense fallback={<MainContentLoading />}>\n {/* suppressHydrationWarning: react-split adds inline styles (height, width)\n to children after mount, causing expected server/client mismatches */}\n <Box\n sx={{\n p: 0,\n contain: \"content\",\n height: \"100%\",\n position: \"relative\",\n }}\n suppressHydrationWarning\n >\n {/*\n * Lineage parallel route - always mounted but visibility controlled\n * This replaces the old RouteAlwaysMount pattern\n */}\n <Box\n sx={{\n display: isLineageRoute ? \"block\" : \"none\",\n height: \"100%\",\n position: isLineageRoute ? \"relative\" : \"absolute\",\n inset: 0,\n }}\n >\n {lineage}\n </Box>\n\n {/* Other route content */}\n {!isLineageRoute && children}\n </Box>\n </Suspense>\n {/* suppressHydrationWarning: react-split adds inline styles after mount */}\n <Box\n sx={{ height: \"100%\", bgcolor: isDark ? \"grey.900\" : \"grey.50\" }}\n suppressHydrationWarning\n >\n {_isRunResultOpen ? (\n <RunResultPane\n onClose={closeRunResult}\n isSingleEnvironment={!!flag?.single_env_onboarding}\n />\n ) : null}\n </Box>\n </VSplit>\n </HSplit>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Link from \"@mui/material/Link\";\nimport MuiPopover from \"@mui/material/Popover\";\nimport { ReactElement, useCallback, useRef, useState } from \"react\";\nimport { RECCE_SUPPORT_CALENDAR_URL } from \"../../lib/const\";\n\ninterface SetupConnectionPopoverProps {\n children: ReactElement<{\n ref?: React.Ref<HTMLElement>;\n [key: string]: unknown;\n }>;\n display: boolean;\n}\n\nexport default function SetupConnectionPopover({\n children,\n display,\n}: SetupConnectionPopoverProps) {\n const [hovered, setHovered] = useState(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n const anchorRef = useRef<HTMLDivElement | null>(null);\n\n const handleMouseEnter = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n setHovered(true);\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n timeoutRef.current = setTimeout(() => {\n setHovered(false);\n }, 100);\n }, []);\n\n if (!display) {\n return children;\n }\n\n return (\n <>\n <Box\n ref={anchorRef}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n sx={{ display: \"contents\" }}\n >\n {children}\n </Box>\n <MuiPopover\n open={hovered}\n anchorEl={anchorRef.current}\n onClose={() => setHovered(false)}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"left\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"left\",\n }}\n disableAutoFocus\n disableEnforceFocus\n sx={{ pointerEvents: \"none\" }}\n slotProps={{\n paper: {\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n sx: {\n bgcolor: \"grey.600\",\n color: \"white\",\n p: 1.5,\n pointerEvents: \"auto\",\n },\n },\n }}\n >\n Connect to a data warehouse to unlock Diff.{\" \"}\n <Link\n href={RECCE_SUPPORT_CALENDAR_URL}\n target=\"_blank\"\n sx={{ color: \"white\", textDecoration: \"underline\" }}\n >\n Learn more\n </Link>\n .\n </MuiPopover>\n </>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport MuiDialog from \"@mui/material/Dialog\";\nimport DialogActions from \"@mui/material/DialogActions\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Stack from \"@mui/material/Stack\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { usePathname, useRouter } from \"next/navigation\";\nimport React, { ChangeEvent, useCallback, useRef, useState } from \"react\";\nimport { FaFileImport } from \"react-icons/fa6\";\nimport { IoClose } from \"react-icons/io5\";\nimport { PiInfo } from \"react-icons/pi\";\nimport { cacheKeys, importState } from \"../../api\";\nimport {\n useLineageGraphContext,\n useRecceInstanceContext,\n useRouteConfig,\n useRunsAggregated,\n} from \"../../contexts\";\nimport { useApiConfig, useIsDark } from \"../../hooks\";\nimport { trackStateAction } from \"../../lib/api/track\";\nimport { toaster } from \"../ui\";\n\nexport function StateImporter({ checksOnly = true }: { checksOnly?: boolean }) {\n const isDark = useIsDark();\n const { featureToggles } = useRecceInstanceContext();\n const queryClient = useQueryClient();\n const { apiClient } = useApiConfig();\n const hiddenFileInput = useRef<HTMLInputElement>(null);\n const cancelRef = useRef<HTMLButtonElement>(null);\n const [selectedFile, setSelectedFile] = useState<File | null>(null);\n const [open, setOpen] = useState(false);\n const router = useRouter();\n const pathname = usePathname();\n const { basePath } = useRouteConfig();\n const [, refetchRunsAggregated] = useRunsAggregated();\n\n const handleImport = useCallback(async () => {\n if (!selectedFile) {\n return;\n }\n\n try {\n const { runs, checks } = await importState(\n selectedFile,\n checksOnly,\n apiClient,\n );\n refetchRunsAggregated?.();\n await queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });\n await queryClient.invalidateQueries({ queryKey: cacheKeys.runs() });\n if (pathname.includes(\"/checks\")) {\n router.push(`${basePath}/checks`);\n }\n const description = checksOnly\n ? `${checks} checks imported successfully`\n : `${runs} runs and ${checks} checks imported successfully`;\n toaster.create({\n description: description,\n type: \"info\",\n duration: 5000,\n closable: true,\n });\n } catch (error) {\n console.error(\"Import failed\", error);\n toaster.create({\n title: \"Import failed\",\n description: String(error),\n type: \"error\",\n duration: 5000,\n closable: true,\n });\n }\n\n setOpen(false);\n }, [\n queryClient,\n selectedFile,\n pathname,\n refetchRunsAggregated,\n checksOnly,\n apiClient,\n router.push,\n basePath,\n ]);\n\n const handleClick = () => {\n if (hiddenFileInput.current) {\n hiddenFileInput.current.click();\n }\n };\n\n const handleFileSelect = (event: ChangeEvent<HTMLInputElement>) => {\n if (event.target.files?.length === 1) {\n setSelectedFile(event.target.files[0]);\n setOpen(true);\n }\n\n if (hiddenFileInput.current) {\n hiddenFileInput.current.value = \"\";\n }\n };\n\n const handleClose = () => setOpen(false);\n\n const warningSubject = checksOnly ? \"checks\" : \"runs and checks\";\n const { isDemoSite } = useLineageGraphContext();\n return (\n <>\n <MuiTooltip\n title={\n \"Import Checklist from State File\" +\n (isDemoSite ? \" (Disabled in the demo site)\" : \"\")\n }\n >\n <IconButton\n sx={{\n pt: \"6px\",\n color: isDark ? \"grey.300\" : \"grey.600\",\n \"&:hover\": { color: isDark ? \"grey.100\" : \"grey.800\" },\n fontSize: 20,\n }}\n aria-label=\"Import state\"\n onClick={() => {\n handleClick();\n trackStateAction({ name: \"import\" });\n }}\n disabled={featureToggles.disableImportStateFile || isDemoSite}\n >\n <FaFileImport />\n </IconButton>\n </MuiTooltip>\n <input\n type=\"file\"\n style={{ display: \"none\" }}\n ref={hiddenFileInput}\n onChange={handleFileSelect}\n />\n <MuiDialog\n open={open}\n onClose={handleClose}\n maxWidth=\"sm\"\n fullWidth\n aria-labelledby=\"import-dialog-title\"\n >\n <DialogTitle\n id=\"import-dialog-title\"\n sx={{ display: \"flex\", alignItems: \"center\", fontWeight: \"bold\" }}\n >\n Import state\n <Box sx={{ flexGrow: 1 }} />\n <IconButton size=\"small\" onClick={handleClose}>\n <IoClose />\n </IconButton>\n </DialogTitle>\n <DialogContent>\n <Stack\n direction=\"column\"\n spacing={1}\n sx={{ px: \"5px\", borderRadius: 1 }}\n >\n <Stack direction=\"row\" alignItems=\"center\" spacing={0.5}>\n <Box component={PiInfo} sx={{ color: \"error.main\" }} />\n <Typography\n component=\"span\"\n sx={{ fontWeight: 500, color: \"error.main\" }}\n >\n Caution!\n </Typography>\n </Stack>\n <Typography>\n The current {warningSubject} will be{\" \"}\n <Typography component=\"span\" sx={{ fontWeight: 600 }}>\n merged\n </Typography>{\" \"}\n with the imported state\n </Typography>\n </Stack>\n </DialogContent>\n <DialogActions>\n <Button ref={cancelRef} onClick={handleClose}>\n Cancel\n </Button>\n <Button\n color=\"iochmara\"\n variant=\"contained\"\n onClick={handleImport}\n sx={{ ml: \"5px\" }}\n >\n Import\n </Button>\n </DialogActions>\n </MuiDialog>\n </>\n );\n}\n","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['', ''], ['', '']);\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class TemplateTag\n * @classdesc Consumes a pipeline of composable transformer plugins and produces a template tag.\n */\nvar TemplateTag = function () {\n /**\n * constructs a template tag\n * @constructs TemplateTag\n * @param {...Object} [...transformers] - an array or arguments list of transformers\n * @return {Function} - a template tag\n */\n function TemplateTag() {\n var _this = this;\n\n for (var _len = arguments.length, transformers = Array(_len), _key = 0; _key < _len; _key++) {\n transformers[_key] = arguments[_key];\n }\n\n _classCallCheck(this, TemplateTag);\n\n this.tag = function (strings) {\n for (var _len2 = arguments.length, expressions = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n expressions[_key2 - 1] = arguments[_key2];\n }\n\n if (typeof strings === 'function') {\n // if the first argument passed is a function, assume it is a template tag and return\n // an intermediary tag that processes the template using the aforementioned tag, passing the\n // result to our tag\n return _this.interimTag.bind(_this, strings);\n }\n\n if (typeof strings === 'string') {\n // if the first argument passed is a string, just transform it\n return _this.transformEndResult(strings);\n }\n\n // else, return a transformed end result of processing the template with our tag\n strings = strings.map(_this.transformString.bind(_this));\n return _this.transformEndResult(strings.reduce(_this.processSubstitutions.bind(_this, expressions)));\n };\n\n // if first argument is an array, extrude it as a list of transformers\n if (transformers.length > 0 && Array.isArray(transformers[0])) {\n transformers = transformers[0];\n }\n\n // if any transformers are functions, this means they are not initiated - automatically initiate them\n this.transformers = transformers.map(function (transformer) {\n return typeof transformer === 'function' ? transformer() : transformer;\n });\n\n // return an ES2015 template tag\n return this.tag;\n }\n\n /**\n * Applies all transformers to a template literal tagged with this method.\n * If a function is passed as the first argument, assumes the function is a template tag\n * and applies it to the template, returning a template tag.\n * @param {(Function|String|Array<String>)} strings - Either a template tag or an array containing template strings separated by identifier\n * @param {...*} ...expressions - Optional list of substitution values.\n * @return {(String|Function)} - Either an intermediary tag function or the results of processing the template.\n */\n\n\n _createClass(TemplateTag, [{\n key: 'interimTag',\n\n\n /**\n * An intermediary template tag that receives a template tag and passes the result of calling the template with the received\n * template tag to our own template tag.\n * @param {Function} nextTag - the received template tag\n * @param {Array<String>} template - the template to process\n * @param {...*} ...substitutions - `substitutions` is an array of all substitutions in the template\n * @return {*} - the final processed value\n */\n value: function interimTag(previousTag, template) {\n for (var _len3 = arguments.length, substitutions = Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {\n substitutions[_key3 - 2] = arguments[_key3];\n }\n\n return this.tag(_templateObject, previousTag.apply(undefined, [template].concat(substitutions)));\n }\n\n /**\n * Performs bulk processing on the tagged template, transforming each substitution and then\n * concatenating the resulting values into a string.\n * @param {Array<*>} substitutions - an array of all remaining substitutions present in this template\n * @param {String} resultSoFar - this iteration's result string so far\n * @param {String} remainingPart - the template chunk after the current substitution\n * @return {String} - the result of joining this iteration's processed substitution with the result\n */\n\n }, {\n key: 'processSubstitutions',\n value: function processSubstitutions(substitutions, resultSoFar, remainingPart) {\n var substitution = this.transformSubstitution(substitutions.shift(), resultSoFar);\n return ''.concat(resultSoFar, substitution, remainingPart);\n }\n\n /**\n * Iterate through each transformer, applying the transformer's `onString` method to the template\n * strings before all substitutions are processed.\n * @param {String} str - The input string\n * @return {String} - The final results of processing each transformer\n */\n\n }, {\n key: 'transformString',\n value: function transformString(str) {\n var cb = function cb(res, transform) {\n return transform.onString ? transform.onString(res) : res;\n };\n return this.transformers.reduce(cb, str);\n }\n\n /**\n * When a substitution is encountered, iterates through each transformer and applies the transformer's\n * `onSubstitution` method to the substitution.\n * @param {*} substitution - The current substitution\n * @param {String} resultSoFar - The result up to and excluding this substitution.\n * @return {*} - The final result of applying all substitution transformations.\n */\n\n }, {\n key: 'transformSubstitution',\n value: function transformSubstitution(substitution, resultSoFar) {\n var cb = function cb(res, transform) {\n return transform.onSubstitution ? transform.onSubstitution(res, resultSoFar) : res;\n };\n return this.transformers.reduce(cb, substitution);\n }\n\n /**\n * Iterates through each transformer, applying the transformer's `onEndResult` method to the\n * template literal after all substitutions have finished processing.\n * @param {String} endResult - The processed template, just before it is returned from the tag\n * @return {String} - The final results of processing each transformer\n */\n\n }, {\n key: 'transformEndResult',\n value: function transformEndResult(endResult) {\n var cb = function cb(res, transform) {\n return transform.onEndResult ? transform.onEndResult(res) : res;\n };\n return this.transformers.reduce(cb, endResult);\n }\n }]);\n\n return TemplateTag;\n}();\n\nexport default TemplateTag;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9UZW1wbGF0ZVRhZy9UZW1wbGF0ZVRhZy5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInRyYW5zZm9ybWVycyIsInRhZyIsInN0cmluZ3MiLCJleHByZXNzaW9ucyIsImludGVyaW1UYWciLCJiaW5kIiwidHJhbnNmb3JtRW5kUmVzdWx0IiwibWFwIiwidHJhbnNmb3JtU3RyaW5nIiwicmVkdWNlIiwicHJvY2Vzc1N1YnN0aXR1dGlvbnMiLCJsZW5ndGgiLCJBcnJheSIsImlzQXJyYXkiLCJ0cmFuc2Zvcm1lciIsInByZXZpb3VzVGFnIiwidGVtcGxhdGUiLCJzdWJzdGl0dXRpb25zIiwicmVzdWx0U29GYXIiLCJyZW1haW5pbmdQYXJ0Iiwic3Vic3RpdHV0aW9uIiwidHJhbnNmb3JtU3Vic3RpdHV0aW9uIiwic2hpZnQiLCJjb25jYXQiLCJzdHIiLCJjYiIsInJlcyIsInRyYW5zZm9ybSIsIm9uU3RyaW5nIiwib25TdWJzdGl0dXRpb24iLCJlbmRSZXN1bHQiLCJvbkVuZFJlc3VsdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7OztJQUlxQkEsVztBQUNuQjs7Ozs7O0FBTUEseUJBQTZCO0FBQUE7O0FBQUEsc0NBQWRDLFlBQWM7QUFBZEEsa0JBQWM7QUFBQTs7QUFBQTs7QUFBQSxTQXVCN0JDLEdBdkI2QixHQXVCdkIsVUFBQ0MsT0FBRCxFQUE2QjtBQUFBLHlDQUFoQkMsV0FBZ0I7QUFBaEJBLG1CQUFnQjtBQUFBOztBQUNqQyxVQUFJLE9BQU9ELE9BQVAsS0FBbUIsVUFBdkIsRUFBbUM7QUFDakM7QUFDQTtBQUNBO0FBQ0EsZUFBTyxNQUFLRSxVQUFMLENBQWdCQyxJQUFoQixDQUFxQixLQUFyQixFQUEyQkgsT0FBM0IsQ0FBUDtBQUNEOztBQUVELFVBQUksT0FBT0EsT0FBUCxLQUFtQixRQUF2QixFQUFpQztBQUMvQjtBQUNBLGVBQU8sTUFBS0ksa0JBQUwsQ0FBd0JKLE9BQXhCLENBQVA7QUFDRDs7QUFFRDtBQUNBQSxnQkFBVUEsUUFBUUssR0FBUixDQUFZLE1BQUtDLGVBQUwsQ0FBcUJILElBQXJCLENBQTBCLEtBQTFCLENBQVosQ0FBVjtBQUNBLGFBQU8sTUFBS0Msa0JBQUwsQ0FDTEosUUFBUU8sTUFBUixDQUFlLE1BQUtDLG9CQUFMLENBQTBCTCxJQUExQixDQUErQixLQUEvQixFQUFxQ0YsV0FBckMsQ0FBZixDQURLLENBQVA7QUFHRCxLQXpDNEI7O0FBQzNCO0FBQ0EsUUFBSUgsYUFBYVcsTUFBYixHQUFzQixDQUF0QixJQUEyQkMsTUFBTUMsT0FBTixDQUFjYixhQUFhLENBQWIsQ0FBZCxDQUEvQixFQUErRDtBQUM3REEscUJBQWVBLGFBQWEsQ0FBYixDQUFmO0FBQ0Q7O0FBRUQ7QUFDQSxTQUFLQSxZQUFMLEdBQW9CQSxhQUFhTyxHQUFiLENBQWlCLHVCQUFlO0FBQ2xELGFBQU8sT0FBT08sV0FBUCxLQUF1QixVQUF2QixHQUFvQ0EsYUFBcEMsR0FBb0RBLFdBQTNEO0FBQ0QsS0FGbUIsQ0FBcEI7O0FBSUE7QUFDQSxXQUFPLEtBQUtiLEdBQVo7QUFDRDs7QUFFRDs7Ozs7Ozs7Ozs7Ozs7QUE0QkE7Ozs7Ozs7OytCQVFXYyxXLEVBQWFDLFEsRUFBNEI7QUFBQSx5Q0FBZkMsYUFBZTtBQUFmQSxxQkFBZTtBQUFBOztBQUNsRCxhQUFPLEtBQUtoQixHQUFaLGtCQUFrQmMsOEJBQVlDLFFBQVosU0FBeUJDLGFBQXpCLEVBQWxCO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs7O3lDQVFxQkEsYSxFQUFlQyxXLEVBQWFDLGEsRUFBZTtBQUM5RCxVQUFNQyxlQUFlLEtBQUtDLHFCQUFMLENBQ25CSixjQUFjSyxLQUFkLEVBRG1CLEVBRW5CSixXQUZtQixDQUFyQjtBQUlBLGFBQU8sR0FBR0ssTUFBSCxDQUFVTCxXQUFWLEVBQXVCRSxZQUF2QixFQUFxQ0QsYUFBckMsQ0FBUDtBQUNEOztBQUVEOzs7Ozs7Ozs7b0NBTWdCSyxHLEVBQUs7QUFDbkIsVUFBTUMsS0FBSyxTQUFMQSxFQUFLLENBQUNDLEdBQUQsRUFBTUMsU0FBTjtBQUFBLGVBQ1RBLFVBQVVDLFFBQVYsR0FBcUJELFVBQVVDLFFBQVYsQ0FBbUJGLEdBQW5CLENBQXJCLEdBQStDQSxHQUR0QztBQUFBLE9BQVg7QUFFQSxhQUFPLEtBQUsxQixZQUFMLENBQWtCUyxNQUFsQixDQUF5QmdCLEVBQXpCLEVBQTZCRCxHQUE3QixDQUFQO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs7MENBT3NCSixZLEVBQWNGLFcsRUFBYTtBQUMvQyxVQUFNTyxLQUFLLFNBQUxBLEVBQUssQ0FBQ0MsR0FBRCxFQUFNQyxTQUFOO0FBQUEsZUFDVEEsVUFBVUUsY0FBVixHQUNJRixVQUFVRSxjQUFWLENBQXlCSCxHQUF6QixFQUE4QlIsV0FBOUIsQ0FESixHQUVJUSxHQUhLO0FBQUEsT0FBWDtBQUlBLGFBQU8sS0FBSzFCLFlBQUwsQ0FBa0JTLE1BQWxCLENBQXlCZ0IsRUFBekIsRUFBNkJMLFlBQTdCLENBQVA7QUFDRDs7QUFFRDs7Ozs7Ozs7O3VDQU1tQlUsUyxFQUFXO0FBQzVCLFVBQU1MLEtBQUssU0FBTEEsRUFBSyxDQUFDQyxHQUFELEVBQU1DLFNBQU47QUFBQSxlQUNUQSxVQUFVSSxXQUFWLEdBQXdCSixVQUFVSSxXQUFWLENBQXNCTCxHQUF0QixDQUF4QixHQUFxREEsR0FENUM7QUFBQSxPQUFYO0FBRUEsYUFBTyxLQUFLMUIsWUFBTCxDQUFrQlMsTUFBbEIsQ0FBeUJnQixFQUF6QixFQUE2QkssU0FBN0IsQ0FBUDtBQUNEOzs7Ozs7ZUFuSGtCL0IsVyIsImZpbGUiOiJUZW1wbGF0ZVRhZy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGNsYXNzIFRlbXBsYXRlVGFnXG4gKiBAY2xhc3NkZXNjIENvbnN1bWVzIGEgcGlwZWxpbmUgb2YgY29tcG9zYWJsZSB0cmFuc2Zvcm1lciBwbHVnaW5zIGFuZCBwcm9kdWNlcyBhIHRlbXBsYXRlIHRhZy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVtcGxhdGVUYWcge1xuICAvKipcbiAgICogY29uc3RydWN0cyBhIHRlbXBsYXRlIHRhZ1xuICAgKiBAY29uc3RydWN0cyBUZW1wbGF0ZVRhZ1xuICAgKiBAcGFyYW0gIHsuLi5PYmplY3R9IFsuLi50cmFuc2Zvcm1lcnNdIC0gYW4gYXJyYXkgb3IgYXJndW1lbnRzIGxpc3Qgb2YgdHJhbnNmb3JtZXJzXG4gICAqIEByZXR1cm4ge0Z1bmN0aW9ufSAgICAgICAgICAgICAgICAgICAgLSBhIHRlbXBsYXRlIHRhZ1xuICAgKi9cbiAgY29uc3RydWN0b3IoLi4udHJhbnNmb3JtZXJzKSB7XG4gICAgLy8gaWYgZmlyc3QgYXJndW1lbnQgaXMgYW4gYXJyYXksIGV4dHJ1ZGUgaXQgYXMgYSBsaXN0IG9mIHRyYW5zZm9ybWVyc1xuICAgIGlmICh0cmFuc2Zvcm1lcnMubGVuZ3RoID4gMCAmJiBBcnJheS5pc0FycmF5KHRyYW5zZm9ybWVyc1swXSkpIHtcbiAgICAgIHRyYW5zZm9ybWVycyA9IHRyYW5zZm9ybWVyc1swXTtcbiAgICB9XG5cbiAgICAvLyBpZiBhbnkgdHJhbnNmb3JtZXJzIGFyZSBmdW5jdGlvbnMsIHRoaXMgbWVhbnMgdGhleSBhcmUgbm90IGluaXRpYXRlZCAtIGF1dG9tYXRpY2FsbHkgaW5pdGlhdGUgdGhlbVxuICAgIHRoaXMudHJhbnNmb3JtZXJzID0gdHJhbnNmb3JtZXJzLm1hcCh0cmFuc2Zvcm1lciA9PiB7XG4gICAgICByZXR1cm4gdHlwZW9mIHRyYW5zZm9ybWVyID09PSAnZnVuY3Rpb24nID8gdHJhbnNmb3JtZXIoKSA6IHRyYW5zZm9ybWVyO1xuICAgIH0pO1xuXG4gICAgLy8gcmV0dXJuIGFuIEVTMjAxNSB0ZW1wbGF0ZSB0YWdcbiAgICByZXR1cm4gdGhpcy50YWc7XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBhbGwgdHJhbnNmb3JtZXJzIHRvIGEgdGVtcGxhdGUgbGl0ZXJhbCB0YWdnZWQgd2l0aCB0aGlzIG1ldGhvZC5cbiAgICogSWYgYSBmdW5jdGlvbiBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LCBhc3N1bWVzIHRoZSBmdW5jdGlvbiBpcyBhIHRlbXBsYXRlIHRhZ1xuICAgKiBhbmQgYXBwbGllcyBpdCB0byB0aGUgdGVtcGxhdGUsIHJldHVybmluZyBhIHRlbXBsYXRlIHRhZy5cbiAgICogQHBhcmFtICB7KEZ1bmN0aW9ufFN0cmluZ3xBcnJheTxTdHJpbmc+KX0gc3RyaW5ncyAgICAgICAgLSBFaXRoZXIgYSB0ZW1wbGF0ZSB0YWcgb3IgYW4gYXJyYXkgY29udGFpbmluZyB0ZW1wbGF0ZSBzdHJpbmdzIHNlcGFyYXRlZCBieSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSAgey4uLip9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV4cHJlc3Npb25zIC0gT3B0aW9uYWwgbGlzdCBvZiBzdWJzdGl0dXRpb24gdmFsdWVzLlxuICAgKiBAcmV0dXJuIHsoU3RyaW5nfEZ1bmN0aW9uKX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEVpdGhlciBhbiBpbnRlcm1lZGlhcnkgdGFnIGZ1bmN0aW9uIG9yIHRoZSByZXN1bHRzIG9mIHByb2Nlc3NpbmcgdGhlIHRlbXBsYXRlLlxuICAgKi9cbiAgdGFnID0gKHN0cmluZ3MsIC4uLmV4cHJlc3Npb25zKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBzdHJpbmdzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBpZiB0aGUgZmlyc3QgYXJndW1lbnQgcGFzc2VkIGlzIGEgZnVuY3Rpb24sIGFzc3VtZSBpdCBpcyBhIHRlbXBsYXRlIHRhZyBhbmQgcmV0dXJuXG4gICAgICAvLyBhbiBpbnRlcm1lZGlhcnkgdGFnIHRoYXQgcHJvY2Vzc2VzIHRoZSB0ZW1wbGF0ZSB1c2luZyB0aGUgYWZvcmVtZW50aW9uZWQgdGFnLCBwYXNzaW5nIHRoZVxuICAgICAgLy8gcmVzdWx0IHRvIG91ciB0YWdcbiAgICAgIHJldHVybiB0aGlzLmludGVyaW1UYWcuYmluZCh0aGlzLCBzdHJpbmdzKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHN0cmluZ3MgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBpZiB0aGUgZmlyc3QgYXJndW1lbnQgcGFzc2VkIGlzIGEgc3RyaW5nLCBqdXN0IHRyYW5zZm9ybSBpdFxuICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtRW5kUmVzdWx0KHN0cmluZ3MpO1xuICAgIH1cblxuICAgIC8vIGVsc2UsIHJldHVybiBhIHRyYW5zZm9ybWVkIGVuZCByZXN1bHQgb2YgcHJvY2Vzc2luZyB0aGUgdGVtcGxhdGUgd2l0aCBvdXIgdGFnXG4gICAgc3RyaW5ncyA9IHN0cmluZ3MubWFwKHRoaXMudHJhbnNmb3JtU3RyaW5nLmJpbmQodGhpcykpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybUVuZFJlc3VsdChcbiAgICAgIHN0cmluZ3MucmVkdWNlKHRoaXMucHJvY2Vzc1N1YnN0aXR1dGlvbnMuYmluZCh0aGlzLCBleHByZXNzaW9ucykpLFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFuIGludGVybWVkaWFyeSB0ZW1wbGF0ZSB0YWcgdGhhdCByZWNlaXZlcyBhIHRlbXBsYXRlIHRhZyBhbmQgcGFzc2VzIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgdGVtcGxhdGUgd2l0aCB0aGUgcmVjZWl2ZWRcbiAgICogdGVtcGxhdGUgdGFnIHRvIG91ciBvd24gdGVtcGxhdGUgdGFnLlxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gICAgICAgIG5leHRUYWcgICAgICAgICAgLSB0aGUgcmVjZWl2ZWQgdGVtcGxhdGUgdGFnXG4gICAqIEBwYXJhbSAge0FycmF5PFN0cmluZz59ICAgdGVtcGxhdGUgICAgICAgICAtIHRoZSB0ZW1wbGF0ZSB0byBwcm9jZXNzXG4gICAqIEBwYXJhbSAgey4uLip9ICAgICAgICAgICAgLi4uc3Vic3RpdHV0aW9ucyAtIGBzdWJzdGl0dXRpb25zYCBpcyBhbiBhcnJheSBvZiBhbGwgc3Vic3RpdHV0aW9ucyBpbiB0aGUgdGVtcGxhdGVcbiAgICogQHJldHVybiB7Kn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdGhlIGZpbmFsIHByb2Nlc3NlZCB2YWx1ZVxuICAgKi9cbiAgaW50ZXJpbVRhZyhwcmV2aW91c1RhZywgdGVtcGxhdGUsIC4uLnN1YnN0aXR1dGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy50YWdgJHtwcmV2aW91c1RhZyh0ZW1wbGF0ZSwgLi4uc3Vic3RpdHV0aW9ucyl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBidWxrIHByb2Nlc3Npbmcgb24gdGhlIHRhZ2dlZCB0ZW1wbGF0ZSwgdHJhbnNmb3JtaW5nIGVhY2ggc3Vic3RpdHV0aW9uIGFuZCB0aGVuXG4gICAqIGNvbmNhdGVuYXRpbmcgdGhlIHJlc3VsdGluZyB2YWx1ZXMgaW50byBhIHN0cmluZy5cbiAgICogQHBhcmFtICB7QXJyYXk8Kj59IHN1YnN0aXR1dGlvbnMgLSBhbiBhcnJheSBvZiBhbGwgcmVtYWluaW5nIHN1YnN0aXR1dGlvbnMgcHJlc2VudCBpbiB0aGlzIHRlbXBsYXRlXG4gICAqIEBwYXJhbSAge1N0cmluZ30gICByZXN1bHRTb0ZhciAgIC0gdGhpcyBpdGVyYXRpb24ncyByZXN1bHQgc3RyaW5nIHNvIGZhclxuICAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgcmVtYWluaW5nUGFydCAtIHRoZSB0ZW1wbGF0ZSBjaHVuayBhZnRlciB0aGUgY3VycmVudCBzdWJzdGl0dXRpb25cbiAgICogQHJldHVybiB7U3RyaW5nfSAgICAgICAgICAgICAgICAgLSB0aGUgcmVzdWx0IG9mIGpvaW5pbmcgdGhpcyBpdGVyYXRpb24ncyBwcm9jZXNzZWQgc3Vic3RpdHV0aW9uIHdpdGggdGhlIHJlc3VsdFxuICAgKi9cbiAgcHJvY2Vzc1N1YnN0aXR1dGlvbnMoc3Vic3RpdHV0aW9ucywgcmVzdWx0U29GYXIsIHJlbWFpbmluZ1BhcnQpIHtcbiAgICBjb25zdCBzdWJzdGl0dXRpb24gPSB0aGlzLnRyYW5zZm9ybVN1YnN0aXR1dGlvbihcbiAgICAgIHN1YnN0aXR1dGlvbnMuc2hpZnQoKSxcbiAgICAgIHJlc3VsdFNvRmFyLFxuICAgICk7XG4gICAgcmV0dXJuICcnLmNvbmNhdChyZXN1bHRTb0Zhciwgc3Vic3RpdHV0aW9uLCByZW1haW5pbmdQYXJ0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlIHRocm91Z2ggZWFjaCB0cmFuc2Zvcm1lciwgYXBwbHlpbmcgdGhlIHRyYW5zZm9ybWVyJ3MgYG9uU3RyaW5nYCBtZXRob2QgdG8gdGhlIHRlbXBsYXRlXG4gICAqIHN0cmluZ3MgYmVmb3JlIGFsbCBzdWJzdGl0dXRpb25zIGFyZSBwcm9jZXNzZWQuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSAgc3RyIC0gVGhlIGlucHV0IHN0cmluZ1xuICAgKiBAcmV0dXJuIHtTdHJpbmd9ICAgICAtIFRoZSBmaW5hbCByZXN1bHRzIG9mIHByb2Nlc3NpbmcgZWFjaCB0cmFuc2Zvcm1lclxuICAgKi9cbiAgdHJhbnNmb3JtU3RyaW5nKHN0cikge1xuICAgIGNvbnN0IGNiID0gKHJlcywgdHJhbnNmb3JtKSA9PlxuICAgICAgdHJhbnNmb3JtLm9uU3RyaW5nID8gdHJhbnNmb3JtLm9uU3RyaW5nKHJlcykgOiByZXM7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtZXJzLnJlZHVjZShjYiwgc3RyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIGEgc3Vic3RpdHV0aW9uIGlzIGVuY291bnRlcmVkLCBpdGVyYXRlcyB0aHJvdWdoIGVhY2ggdHJhbnNmb3JtZXIgYW5kIGFwcGxpZXMgdGhlIHRyYW5zZm9ybWVyJ3NcbiAgICogYG9uU3Vic3RpdHV0aW9uYCBtZXRob2QgdG8gdGhlIHN1YnN0aXR1dGlvbi5cbiAgICogQHBhcmFtICB7Kn0gICAgICBzdWJzdGl0dXRpb24gLSBUaGUgY3VycmVudCBzdWJzdGl0dXRpb25cbiAgICogQHBhcmFtICB7U3RyaW5nfSByZXN1bHRTb0ZhciAgLSBUaGUgcmVzdWx0IHVwIHRvIGFuZCBleGNsdWRpbmcgdGhpcyBzdWJzdGl0dXRpb24uXG4gICAqIEByZXR1cm4geyp9ICAgICAgICAgICAgICAgICAgIC0gVGhlIGZpbmFsIHJlc3VsdCBvZiBhcHBseWluZyBhbGwgc3Vic3RpdHV0aW9uIHRyYW5zZm9ybWF0aW9ucy5cbiAgICovXG4gIHRyYW5zZm9ybVN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24sIHJlc3VsdFNvRmFyKSB7XG4gICAgY29uc3QgY2IgPSAocmVzLCB0cmFuc2Zvcm0pID0+XG4gICAgICB0cmFuc2Zvcm0ub25TdWJzdGl0dXRpb25cbiAgICAgICAgPyB0cmFuc2Zvcm0ub25TdWJzdGl0dXRpb24ocmVzLCByZXN1bHRTb0ZhcilcbiAgICAgICAgOiByZXM7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtZXJzLnJlZHVjZShjYiwgc3Vic3RpdHV0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyB0aHJvdWdoIGVhY2ggdHJhbnNmb3JtZXIsIGFwcGx5aW5nIHRoZSB0cmFuc2Zvcm1lcidzIGBvbkVuZFJlc3VsdGAgbWV0aG9kIHRvIHRoZVxuICAgKiB0ZW1wbGF0ZSBsaXRlcmFsIGFmdGVyIGFsbCBzdWJzdGl0dXRpb25zIGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy5cbiAgICogQHBhcmFtICB7U3RyaW5nfSBlbmRSZXN1bHQgLSBUaGUgcHJvY2Vzc2VkIHRlbXBsYXRlLCBqdXN0IGJlZm9yZSBpdCBpcyByZXR1cm5lZCBmcm9tIHRoZSB0YWdcbiAgICogQHJldHVybiB7U3RyaW5nfSAgICAgICAgICAgLSBUaGUgZmluYWwgcmVzdWx0cyBvZiBwcm9jZXNzaW5nIGVhY2ggdHJhbnNmb3JtZXJcbiAgICovXG4gIHRyYW5zZm9ybUVuZFJlc3VsdChlbmRSZXN1bHQpIHtcbiAgICBjb25zdCBjYiA9IChyZXMsIHRyYW5zZm9ybSkgPT5cbiAgICAgIHRyYW5zZm9ybS5vbkVuZFJlc3VsdCA/IHRyYW5zZm9ybS5vbkVuZFJlc3VsdChyZXMpIDogcmVzO1xuICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybWVycy5yZWR1Y2UoY2IsIGVuZFJlc3VsdCk7XG4gIH1cbn1cbiJdfQ==","/**\n * TemplateTag transformer that trims whitespace on the end result of a tagged template\n * @param {String} side = '' - The side of the string to trim. Can be 'start' or 'end' (alternatively 'left' or 'right')\n * @return {Object} - a TemplateTag transformer\n */\nvar trimResultTransformer = function trimResultTransformer() {\n var side = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n return {\n onEndResult: function onEndResult(endResult) {\n if (side === '') {\n return endResult.trim();\n }\n\n side = side.toLowerCase();\n\n if (side === 'start' || side === 'left') {\n return endResult.replace(/^\\s*/, '');\n }\n\n if (side === 'end' || side === 'right') {\n return endResult.replace(/\\s*$/, '');\n }\n\n throw new Error('Side not supported: ' + side);\n }\n };\n};\n\nexport default trimResultTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90cmltUmVzdWx0VHJhbnNmb3JtZXIvdHJpbVJlc3VsdFRyYW5zZm9ybWVyLmpzIl0sIm5hbWVzIjpbInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInNpZGUiLCJvbkVuZFJlc3VsdCIsImVuZFJlc3VsdCIsInRyaW0iLCJ0b0xvd2VyQ2FzZSIsInJlcGxhY2UiLCJFcnJvciJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0FBS0EsSUFBTUEsd0JBQXdCLFNBQXhCQSxxQkFBd0I7QUFBQSxNQUFDQyxJQUFELHVFQUFRLEVBQVI7QUFBQSxTQUFnQjtBQUM1Q0MsZUFENEMsdUJBQ2hDQyxTQURnQyxFQUNyQjtBQUNyQixVQUFJRixTQUFTLEVBQWIsRUFBaUI7QUFDZixlQUFPRSxVQUFVQyxJQUFWLEVBQVA7QUFDRDs7QUFFREgsYUFBT0EsS0FBS0ksV0FBTCxFQUFQOztBQUVBLFVBQUlKLFNBQVMsT0FBVCxJQUFvQkEsU0FBUyxNQUFqQyxFQUF5QztBQUN2QyxlQUFPRSxVQUFVRyxPQUFWLENBQWtCLE1BQWxCLEVBQTBCLEVBQTFCLENBQVA7QUFDRDs7QUFFRCxVQUFJTCxTQUFTLEtBQVQsSUFBa0JBLFNBQVMsT0FBL0IsRUFBd0M7QUFDdEMsZUFBT0UsVUFBVUcsT0FBVixDQUFrQixNQUFsQixFQUEwQixFQUExQixDQUFQO0FBQ0Q7O0FBRUQsWUFBTSxJQUFJQyxLQUFKLDBCQUFpQ04sSUFBakMsQ0FBTjtBQUNEO0FBakIyQyxHQUFoQjtBQUFBLENBQTlCOztBQW9CQSxlQUFlRCxxQkFBZiIsImZpbGUiOiJ0cmltUmVzdWx0VHJhbnNmb3JtZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRlbXBsYXRlVGFnIHRyYW5zZm9ybWVyIHRoYXQgdHJpbXMgd2hpdGVzcGFjZSBvbiB0aGUgZW5kIHJlc3VsdCBvZiBhIHRhZ2dlZCB0ZW1wbGF0ZVxuICogQHBhcmFtICB7U3RyaW5nfSBzaWRlID0gJycgLSBUaGUgc2lkZSBvZiB0aGUgc3RyaW5nIHRvIHRyaW0uIENhbiBiZSAnc3RhcnQnIG9yICdlbmQnIChhbHRlcm5hdGl2ZWx5ICdsZWZ0JyBvciAncmlnaHQnKVxuICogQHJldHVybiB7T2JqZWN0fSAgICAgICAgICAgLSBhIFRlbXBsYXRlVGFnIHRyYW5zZm9ybWVyXG4gKi9cbmNvbnN0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciA9IChzaWRlID0gJycpID0+ICh7XG4gIG9uRW5kUmVzdWx0KGVuZFJlc3VsdCkge1xuICAgIGlmIChzaWRlID09PSAnJykge1xuICAgICAgcmV0dXJuIGVuZFJlc3VsdC50cmltKCk7XG4gICAgfVxuXG4gICAgc2lkZSA9IHNpZGUudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmIChzaWRlID09PSAnc3RhcnQnIHx8IHNpZGUgPT09ICdsZWZ0Jykge1xuICAgICAgcmV0dXJuIGVuZFJlc3VsdC5yZXBsYWNlKC9eXFxzKi8sICcnKTtcbiAgICB9XG5cbiAgICBpZiAoc2lkZSA9PT0gJ2VuZCcgfHwgc2lkZSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgcmV0dXJuIGVuZFJlc3VsdC5yZXBsYWNlKC9cXHMqJC8sICcnKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNpZGUgbm90IHN1cHBvcnRlZDogJHtzaWRlfWApO1xuICB9LFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lcjtcbiJdfQ==","function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n/**\n * strips indentation from a template literal\n * @param {String} type = 'initial' - whether to remove all indentation or just leading indentation. can be 'all' or 'initial'\n * @return {Object} - a TemplateTag transformer\n */\nvar stripIndentTransformer = function stripIndentTransformer() {\n var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'initial';\n return {\n onEndResult: function onEndResult(endResult) {\n if (type === 'initial') {\n // remove the shortest leading indentation from each line\n var match = endResult.match(/^[^\\S\\n]*(?=\\S)/gm);\n var indent = match && Math.min.apply(Math, _toConsumableArray(match.map(function (el) {\n return el.length;\n })));\n if (indent) {\n var regexp = new RegExp('^.{' + indent + '}', 'gm');\n return endResult.replace(regexp, '');\n }\n return endResult;\n }\n if (type === 'all') {\n // remove all indentation from each line\n return endResult.replace(/^[^\\S\\n]+/gm, '');\n }\n throw new Error('Unknown type: ' + type);\n }\n };\n};\n\nexport default stripIndentTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJpcEluZGVudFRyYW5zZm9ybWVyL3N0cmlwSW5kZW50VHJhbnNmb3JtZXIuanMiXSwibmFtZXMiOlsic3RyaXBJbmRlbnRUcmFuc2Zvcm1lciIsInR5cGUiLCJvbkVuZFJlc3VsdCIsImVuZFJlc3VsdCIsIm1hdGNoIiwiaW5kZW50IiwiTWF0aCIsIm1pbiIsIm1hcCIsImVsIiwibGVuZ3RoIiwicmVnZXhwIiwiUmVnRXhwIiwicmVwbGFjZSIsIkVycm9yIl0sIm1hcHBpbmdzIjoiOztBQUFBOzs7OztBQUtBLElBQU1BLHlCQUF5QixTQUF6QkEsc0JBQXlCO0FBQUEsTUFBQ0MsSUFBRCx1RUFBUSxTQUFSO0FBQUEsU0FBdUI7QUFDcERDLGVBRG9ELHVCQUN4Q0MsU0FEd0MsRUFDN0I7QUFDckIsVUFBSUYsU0FBUyxTQUFiLEVBQXdCO0FBQ3RCO0FBQ0EsWUFBTUcsUUFBUUQsVUFBVUMsS0FBVixDQUFnQixtQkFBaEIsQ0FBZDtBQUNBLFlBQU1DLFNBQVNELFNBQVNFLEtBQUtDLEdBQUwsZ0NBQVlILE1BQU1JLEdBQU4sQ0FBVTtBQUFBLGlCQUFNQyxHQUFHQyxNQUFUO0FBQUEsU0FBVixDQUFaLEVBQXhCO0FBQ0EsWUFBSUwsTUFBSixFQUFZO0FBQ1YsY0FBTU0sU0FBUyxJQUFJQyxNQUFKLFNBQWlCUCxNQUFqQixRQUE0QixJQUE1QixDQUFmO0FBQ0EsaUJBQU9GLFVBQVVVLE9BQVYsQ0FBa0JGLE1BQWxCLEVBQTBCLEVBQTFCLENBQVA7QUFDRDtBQUNELGVBQU9SLFNBQVA7QUFDRDtBQUNELFVBQUlGLFNBQVMsS0FBYixFQUFvQjtBQUNsQjtBQUNBLGVBQU9FLFVBQVVVLE9BQVYsQ0FBa0IsYUFBbEIsRUFBaUMsRUFBakMsQ0FBUDtBQUNEO0FBQ0QsWUFBTSxJQUFJQyxLQUFKLG9CQUEyQmIsSUFBM0IsQ0FBTjtBQUNEO0FBakJtRCxHQUF2QjtBQUFBLENBQS9COztBQW9CQSxlQUFlRCxzQkFBZiIsImZpbGUiOiJzdHJpcEluZGVudFRyYW5zZm9ybWVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBzdHJpcHMgaW5kZW50YXRpb24gZnJvbSBhIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEBwYXJhbSAge1N0cmluZ30gdHlwZSA9ICdpbml0aWFsJyAtIHdoZXRoZXIgdG8gcmVtb3ZlIGFsbCBpbmRlbnRhdGlvbiBvciBqdXN0IGxlYWRpbmcgaW5kZW50YXRpb24uIGNhbiBiZSAnYWxsJyBvciAnaW5pdGlhbCdcbiAqIEByZXR1cm4ge09iamVjdH0gICAgICAgICAgICAgICAgICAtIGEgVGVtcGxhdGVUYWcgdHJhbnNmb3JtZXJcbiAqL1xuY29uc3Qgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciA9ICh0eXBlID0gJ2luaXRpYWwnKSA9PiAoe1xuICBvbkVuZFJlc3VsdChlbmRSZXN1bHQpIHtcbiAgICBpZiAodHlwZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAvLyByZW1vdmUgdGhlIHNob3J0ZXN0IGxlYWRpbmcgaW5kZW50YXRpb24gZnJvbSBlYWNoIGxpbmVcbiAgICAgIGNvbnN0IG1hdGNoID0gZW5kUmVzdWx0Lm1hdGNoKC9eW15cXFNcXG5dKig/PVxcUykvZ20pO1xuICAgICAgY29uc3QgaW5kZW50ID0gbWF0Y2ggJiYgTWF0aC5taW4oLi4ubWF0Y2gubWFwKGVsID0+IGVsLmxlbmd0aCkpO1xuICAgICAgaWYgKGluZGVudCkge1xuICAgICAgICBjb25zdCByZWdleHAgPSBuZXcgUmVnRXhwKGBeLnske2luZGVudH19YCwgJ2dtJyk7XG4gICAgICAgIHJldHVybiBlbmRSZXN1bHQucmVwbGFjZShyZWdleHAsICcnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbmRSZXN1bHQ7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnYWxsJykge1xuICAgICAgLy8gcmVtb3ZlIGFsbCBpbmRlbnRhdGlvbiBmcm9tIGVhY2ggbGluZVxuICAgICAgcmV0dXJuIGVuZFJlc3VsdC5yZXBsYWNlKC9eW15cXFNcXG5dKy9nbSwgJycpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdHlwZTogJHt0eXBlfWApO1xuICB9LFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHN0cmlwSW5kZW50VHJhbnNmb3JtZXI7XG4iXX0=","/**\n * Replaces tabs, newlines and spaces with the chosen value when they occur in sequences\n * @param {(String|RegExp)} replaceWhat - the value or pattern that should be replaced\n * @param {*} replaceWith - the replacement value\n * @return {Object} - a TemplateTag transformer\n */\nvar replaceResultTransformer = function replaceResultTransformer(replaceWhat, replaceWith) {\n return {\n onEndResult: function onEndResult(endResult) {\n if (replaceWhat == null || replaceWith == null) {\n throw new Error('replaceResultTransformer requires at least 2 arguments.');\n }\n return endResult.replace(replaceWhat, replaceWith);\n }\n };\n};\n\nexport default replaceResultTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIvcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyLmpzIl0sIm5hbWVzIjpbInJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciIsInJlcGxhY2VXaGF0IiwicmVwbGFjZVdpdGgiLCJvbkVuZFJlc3VsdCIsImVuZFJlc3VsdCIsIkVycm9yIiwicmVwbGFjZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztBQU1BLElBQU1BLDJCQUEyQixTQUEzQkEsd0JBQTJCLENBQUNDLFdBQUQsRUFBY0MsV0FBZDtBQUFBLFNBQStCO0FBQzlEQyxlQUQ4RCx1QkFDbERDLFNBRGtELEVBQ3ZDO0FBQ3JCLFVBQUlILGVBQWUsSUFBZixJQUF1QkMsZUFBZSxJQUExQyxFQUFnRDtBQUM5QyxjQUFNLElBQUlHLEtBQUosQ0FDSix5REFESSxDQUFOO0FBR0Q7QUFDRCxhQUFPRCxVQUFVRSxPQUFWLENBQWtCTCxXQUFsQixFQUErQkMsV0FBL0IsQ0FBUDtBQUNEO0FBUjZELEdBQS9CO0FBQUEsQ0FBakM7O0FBV0EsZUFBZUYsd0JBQWYiLCJmaWxlIjoicmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXBsYWNlcyB0YWJzLCBuZXdsaW5lcyBhbmQgc3BhY2VzIHdpdGggdGhlIGNob3NlbiB2YWx1ZSB3aGVuIHRoZXkgb2NjdXIgaW4gc2VxdWVuY2VzXG4gKiBAcGFyYW0gIHsoU3RyaW5nfFJlZ0V4cCl9IHJlcGxhY2VXaGF0IC0gdGhlIHZhbHVlIG9yIHBhdHRlcm4gdGhhdCBzaG91bGQgYmUgcmVwbGFjZWRcbiAqIEBwYXJhbSAgeyp9ICAgICAgICAgICAgICAgcmVwbGFjZVdpdGggLSB0aGUgcmVwbGFjZW1lbnQgdmFsdWVcbiAqIEByZXR1cm4ge09iamVjdH0gICAgICAgICAgICAgICAgICAgICAgLSBhIFRlbXBsYXRlVGFnIHRyYW5zZm9ybWVyXG4gKi9cbmNvbnN0IHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciA9IChyZXBsYWNlV2hhdCwgcmVwbGFjZVdpdGgpID0+ICh7XG4gIG9uRW5kUmVzdWx0KGVuZFJlc3VsdCkge1xuICAgIGlmIChyZXBsYWNlV2hhdCA9PSBudWxsIHx8IHJlcGxhY2VXaXRoID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3JlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciByZXF1aXJlcyBhdCBsZWFzdCAyIGFyZ3VtZW50cy4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGVuZFJlc3VsdC5yZXBsYWNlKHJlcGxhY2VXaGF0LCByZXBsYWNlV2l0aCk7XG4gIH0sXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyO1xuIl19","var replaceSubstitutionTransformer = function replaceSubstitutionTransformer(replaceWhat, replaceWith) {\n return {\n onSubstitution: function onSubstitution(substitution, resultSoFar) {\n if (replaceWhat == null || replaceWith == null) {\n throw new Error('replaceSubstitutionTransformer requires at least 2 arguments.');\n }\n\n // Do not touch if null or undefined\n if (substitution == null) {\n return substitution;\n } else {\n return substitution.toString().replace(replaceWhat, replaceWith);\n }\n }\n };\n};\n\nexport default replaceSubstitutionTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIvcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyLmpzIl0sIm5hbWVzIjpbInJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lciIsInJlcGxhY2VXaGF0IiwicmVwbGFjZVdpdGgiLCJvblN1YnN0aXR1dGlvbiIsInN1YnN0aXR1dGlvbiIsInJlc3VsdFNvRmFyIiwiRXJyb3IiLCJ0b1N0cmluZyIsInJlcGxhY2UiXSwibWFwcGluZ3MiOiJBQUFBLElBQU1BLGlDQUFpQyxTQUFqQ0EsOEJBQWlDLENBQUNDLFdBQUQsRUFBY0MsV0FBZDtBQUFBLFNBQStCO0FBQ3BFQyxrQkFEb0UsMEJBQ3JEQyxZQURxRCxFQUN2Q0MsV0FEdUMsRUFDMUI7QUFDeEMsVUFBSUosZUFBZSxJQUFmLElBQXVCQyxlQUFlLElBQTFDLEVBQWdEO0FBQzlDLGNBQU0sSUFBSUksS0FBSixDQUNKLCtEQURJLENBQU47QUFHRDs7QUFFRDtBQUNBLFVBQUlGLGdCQUFnQixJQUFwQixFQUEwQjtBQUN4QixlQUFPQSxZQUFQO0FBQ0QsT0FGRCxNQUVPO0FBQ0wsZUFBT0EsYUFBYUcsUUFBYixHQUF3QkMsT0FBeEIsQ0FBZ0NQLFdBQWhDLEVBQTZDQyxXQUE3QyxDQUFQO0FBQ0Q7QUFDRjtBQWRtRSxHQUEvQjtBQUFBLENBQXZDOztBQWlCQSxlQUFlRiw4QkFBZiIsImZpbGUiOiJyZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCByZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIgPSAocmVwbGFjZVdoYXQsIHJlcGxhY2VXaXRoKSA9PiAoe1xuICBvblN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24sIHJlc3VsdFNvRmFyKSB7XG4gICAgaWYgKHJlcGxhY2VXaGF0ID09IG51bGwgfHwgcmVwbGFjZVdpdGggPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAncmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyIHJlcXVpcmVzIGF0IGxlYXN0IDIgYXJndW1lbnRzLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIERvIG5vdCB0b3VjaCBpZiBudWxsIG9yIHVuZGVmaW5lZFxuICAgIGlmIChzdWJzdGl0dXRpb24gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHN1YnN0aXR1dGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHN1YnN0aXR1dGlvbi50b1N0cmluZygpLnJlcGxhY2UocmVwbGFjZVdoYXQsIHJlcGxhY2VXaXRoKTtcbiAgICB9XG4gIH0sXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyO1xuIl19","var defaults = {\n separator: '',\n conjunction: '',\n serial: false\n};\n\n/**\n * Converts an array substitution to a string containing a list\n * @param {String} [opts.separator = ''] - the character that separates each item\n * @param {String} [opts.conjunction = ''] - replace the last separator with this\n * @param {Boolean} [opts.serial = false] - include the separator before the conjunction? (Oxford comma use-case)\n *\n * @return {Object} - a TemplateTag transformer\n */\nvar inlineArrayTransformer = function inlineArrayTransformer() {\n var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaults;\n return {\n onSubstitution: function onSubstitution(substitution, resultSoFar) {\n // only operate on arrays\n if (Array.isArray(substitution)) {\n var arrayLength = substitution.length;\n var separator = opts.separator;\n var conjunction = opts.conjunction;\n var serial = opts.serial;\n // join each item in the array into a string where each item is separated by separator\n // be sure to maintain indentation\n var indent = resultSoFar.match(/(\\n?[^\\S\\n]+)$/);\n if (indent) {\n substitution = substitution.join(separator + indent[1]);\n } else {\n substitution = substitution.join(separator + ' ');\n }\n // if conjunction is set, replace the last separator with conjunction, but only if there is more than one substitution\n if (conjunction && arrayLength > 1) {\n var separatorIndex = substitution.lastIndexOf(separator);\n substitution = substitution.slice(0, separatorIndex) + (serial ? separator : '') + ' ' + conjunction + substitution.slice(separatorIndex + 1);\n }\n }\n return substitution;\n }\n };\n};\n\nexport default inlineArrayTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbmxpbmVBcnJheVRyYW5zZm9ybWVyL2lubGluZUFycmF5VHJhbnNmb3JtZXIuanMiXSwibmFtZXMiOlsiZGVmYXVsdHMiLCJzZXBhcmF0b3IiLCJjb25qdW5jdGlvbiIsInNlcmlhbCIsImlubGluZUFycmF5VHJhbnNmb3JtZXIiLCJvcHRzIiwib25TdWJzdGl0dXRpb24iLCJzdWJzdGl0dXRpb24iLCJyZXN1bHRTb0ZhciIsIkFycmF5IiwiaXNBcnJheSIsImFycmF5TGVuZ3RoIiwibGVuZ3RoIiwiaW5kZW50IiwibWF0Y2giLCJqb2luIiwic2VwYXJhdG9ySW5kZXgiLCJsYXN0SW5kZXhPZiIsInNsaWNlIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSxXQUFXO0FBQ2ZDLGFBQVcsRUFESTtBQUVmQyxlQUFhLEVBRkU7QUFHZkMsVUFBUTtBQUhPLENBQWpCOztBQU1BOzs7Ozs7OztBQVFBLElBQU1DLHlCQUF5QixTQUF6QkEsc0JBQXlCO0FBQUEsTUFBQ0MsSUFBRCx1RUFBUUwsUUFBUjtBQUFBLFNBQXNCO0FBQ25ETSxrQkFEbUQsMEJBQ3BDQyxZQURvQyxFQUN0QkMsV0FEc0IsRUFDVDtBQUN4QztBQUNBLFVBQUlDLE1BQU1DLE9BQU4sQ0FBY0gsWUFBZCxDQUFKLEVBQWlDO0FBQy9CLFlBQU1JLGNBQWNKLGFBQWFLLE1BQWpDO0FBQ0EsWUFBTVgsWUFBWUksS0FBS0osU0FBdkI7QUFDQSxZQUFNQyxjQUFjRyxLQUFLSCxXQUF6QjtBQUNBLFlBQU1DLFNBQVNFLEtBQUtGLE1BQXBCO0FBQ0E7QUFDQTtBQUNBLFlBQU1VLFNBQVNMLFlBQVlNLEtBQVosQ0FBa0IsZ0JBQWxCLENBQWY7QUFDQSxZQUFJRCxNQUFKLEVBQVk7QUFDVk4seUJBQWVBLGFBQWFRLElBQWIsQ0FBa0JkLFlBQVlZLE9BQU8sQ0FBUCxDQUE5QixDQUFmO0FBQ0QsU0FGRCxNQUVPO0FBQ0xOLHlCQUFlQSxhQUFhUSxJQUFiLENBQWtCZCxZQUFZLEdBQTlCLENBQWY7QUFDRDtBQUNEO0FBQ0EsWUFBSUMsZUFBZVMsY0FBYyxDQUFqQyxFQUFvQztBQUNsQyxjQUFNSyxpQkFBaUJULGFBQWFVLFdBQWIsQ0FBeUJoQixTQUF6QixDQUF2QjtBQUNBTSx5QkFDRUEsYUFBYVcsS0FBYixDQUFtQixDQUFuQixFQUFzQkYsY0FBdEIsS0FDQ2IsU0FBU0YsU0FBVCxHQUFxQixFQUR0QixJQUVBLEdBRkEsR0FHQUMsV0FIQSxHQUlBSyxhQUFhVyxLQUFiLENBQW1CRixpQkFBaUIsQ0FBcEMsQ0FMRjtBQU1EO0FBQ0Y7QUFDRCxhQUFPVCxZQUFQO0FBQ0Q7QUE1QmtELEdBQXRCO0FBQUEsQ0FBL0I7O0FBK0JBLGVBQWVILHNCQUFmIiwiZmlsZSI6ImlubGluZUFycmF5VHJhbnNmb3JtZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBkZWZhdWx0cyA9IHtcbiAgc2VwYXJhdG9yOiAnJyxcbiAgY29uanVuY3Rpb246ICcnLFxuICBzZXJpYWw6IGZhbHNlLFxufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBhcnJheSBzdWJzdGl0dXRpb24gdG8gYSBzdHJpbmcgY29udGFpbmluZyBhIGxpc3RcbiAqIEBwYXJhbSAge1N0cmluZ30gW29wdHMuc2VwYXJhdG9yID0gJyddIC0gdGhlIGNoYXJhY3RlciB0aGF0IHNlcGFyYXRlcyBlYWNoIGl0ZW1cbiAqIEBwYXJhbSAge1N0cmluZ30gW29wdHMuY29uanVuY3Rpb24gPSAnJ10gIC0gcmVwbGFjZSB0aGUgbGFzdCBzZXBhcmF0b3Igd2l0aCB0aGlzXG4gKiBAcGFyYW0gIHtCb29sZWFufSBbb3B0cy5zZXJpYWwgPSBmYWxzZV0gLSBpbmNsdWRlIHRoZSBzZXBhcmF0b3IgYmVmb3JlIHRoZSBjb25qdW5jdGlvbj8gKE94Zm9yZCBjb21tYSB1c2UtY2FzZSlcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9ICAgICAgICAgICAgICAgICAgICAgLSBhIFRlbXBsYXRlVGFnIHRyYW5zZm9ybWVyXG4gKi9cbmNvbnN0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgPSAob3B0cyA9IGRlZmF1bHRzKSA9PiAoe1xuICBvblN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24sIHJlc3VsdFNvRmFyKSB7XG4gICAgLy8gb25seSBvcGVyYXRlIG9uIGFycmF5c1xuICAgIGlmIChBcnJheS5pc0FycmF5KHN1YnN0aXR1dGlvbikpIHtcbiAgICAgIGNvbnN0IGFycmF5TGVuZ3RoID0gc3Vic3RpdHV0aW9uLmxlbmd0aDtcbiAgICAgIGNvbnN0IHNlcGFyYXRvciA9IG9wdHMuc2VwYXJhdG9yO1xuICAgICAgY29uc3QgY29uanVuY3Rpb24gPSBvcHRzLmNvbmp1bmN0aW9uO1xuICAgICAgY29uc3Qgc2VyaWFsID0gb3B0cy5zZXJpYWw7XG4gICAgICAvLyBqb2luIGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkgaW50byBhIHN0cmluZyB3aGVyZSBlYWNoIGl0ZW0gaXMgc2VwYXJhdGVkIGJ5IHNlcGFyYXRvclxuICAgICAgLy8gYmUgc3VyZSB0byBtYWludGFpbiBpbmRlbnRhdGlvblxuICAgICAgY29uc3QgaW5kZW50ID0gcmVzdWx0U29GYXIubWF0Y2goLyhcXG4/W15cXFNcXG5dKykkLyk7XG4gICAgICBpZiAoaW5kZW50KSB7XG4gICAgICAgIHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbi5qb2luKHNlcGFyYXRvciArIGluZGVudFsxXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb24uam9pbihzZXBhcmF0b3IgKyAnICcpO1xuICAgICAgfVxuICAgICAgLy8gaWYgY29uanVuY3Rpb24gaXMgc2V0LCByZXBsYWNlIHRoZSBsYXN0IHNlcGFyYXRvciB3aXRoIGNvbmp1bmN0aW9uLCBidXQgb25seSBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHN1YnN0aXR1dGlvblxuICAgICAgaWYgKGNvbmp1bmN0aW9uICYmIGFycmF5TGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IHN1YnN0aXR1dGlvbi5sYXN0SW5kZXhPZihzZXBhcmF0b3IpO1xuICAgICAgICBzdWJzdGl0dXRpb24gPVxuICAgICAgICAgIHN1YnN0aXR1dGlvbi5zbGljZSgwLCBzZXBhcmF0b3JJbmRleCkgK1xuICAgICAgICAgIChzZXJpYWwgPyBzZXBhcmF0b3IgOiAnJykgK1xuICAgICAgICAgICcgJyArXG4gICAgICAgICAgY29uanVuY3Rpb24gK1xuICAgICAgICAgIHN1YnN0aXR1dGlvbi5zbGljZShzZXBhcmF0b3JJbmRleCArIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3Vic3RpdHV0aW9uO1xuICB9LFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGlubGluZUFycmF5VHJhbnNmb3JtZXI7XG4iXX0=","var splitStringTransformer = function splitStringTransformer(splitBy) {\n return {\n onSubstitution: function onSubstitution(substitution, resultSoFar) {\n if (splitBy != null && typeof splitBy === 'string') {\n if (typeof substitution === 'string' && substitution.includes(splitBy)) {\n substitution = substitution.split(splitBy);\n }\n } else {\n throw new Error('You need to specify a string character to split by.');\n }\n return substitution;\n }\n };\n};\n\nexport default splitStringTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcGxpdFN0cmluZ1RyYW5zZm9ybWVyL3NwbGl0U3RyaW5nVHJhbnNmb3JtZXIuanMiXSwibmFtZXMiOlsic3BsaXRTdHJpbmdUcmFuc2Zvcm1lciIsIm9uU3Vic3RpdHV0aW9uIiwic3Vic3RpdHV0aW9uIiwicmVzdWx0U29GYXIiLCJzcGxpdEJ5IiwiaW5jbHVkZXMiLCJzcGxpdCIsIkVycm9yIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSx5QkFBeUIsU0FBekJBLHNCQUF5QjtBQUFBLFNBQVk7QUFDekNDLGtCQUR5QywwQkFDMUJDLFlBRDBCLEVBQ1pDLFdBRFksRUFDQztBQUN4QyxVQUFJQyxXQUFXLElBQVgsSUFBbUIsT0FBT0EsT0FBUCxLQUFtQixRQUExQyxFQUFvRDtBQUNsRCxZQUFJLE9BQU9GLFlBQVAsS0FBd0IsUUFBeEIsSUFBb0NBLGFBQWFHLFFBQWIsQ0FBc0JELE9BQXRCLENBQXhDLEVBQXdFO0FBQ3RFRix5QkFBZUEsYUFBYUksS0FBYixDQUFtQkYsT0FBbkIsQ0FBZjtBQUNEO0FBQ0YsT0FKRCxNQUlPO0FBQ0wsY0FBTSxJQUFJRyxLQUFKLENBQVUscURBQVYsQ0FBTjtBQUNEO0FBQ0QsYUFBT0wsWUFBUDtBQUNEO0FBVndDLEdBQVo7QUFBQSxDQUEvQjs7QUFhQSxlQUFlRixzQkFBZiIsImZpbGUiOiJzcGxpdFN0cmluZ1RyYW5zZm9ybWVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3Qgc3BsaXRTdHJpbmdUcmFuc2Zvcm1lciA9IHNwbGl0QnkgPT4gKHtcbiAgb25TdWJzdGl0dXRpb24oc3Vic3RpdHV0aW9uLCByZXN1bHRTb0Zhcikge1xuICAgIGlmIChzcGxpdEJ5ICE9IG51bGwgJiYgdHlwZW9mIHNwbGl0QnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAodHlwZW9mIHN1YnN0aXR1dGlvbiA9PT0gJ3N0cmluZycgJiYgc3Vic3RpdHV0aW9uLmluY2x1ZGVzKHNwbGl0QnkpKSB7XG4gICAgICAgIHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbi5zcGxpdChzcGxpdEJ5KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBzcGVjaWZ5IGEgc3RyaW5nIGNoYXJhY3RlciB0byBzcGxpdCBieS4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1YnN0aXR1dGlvbjtcbiAgfSxcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBzcGxpdFN0cmluZ1RyYW5zZm9ybWVyO1xuIl19","var isValidValue = function isValidValue(x) {\n return x != null && !Number.isNaN(x) && typeof x !== 'boolean';\n};\n\nvar removeNonPrintingValuesTransformer = function removeNonPrintingValuesTransformer() {\n return {\n onSubstitution: function onSubstitution(substitution) {\n if (Array.isArray(substitution)) {\n return substitution.filter(isValidValue);\n }\n if (isValidValue(substitution)) {\n return substitution;\n }\n return '';\n }\n };\n};\n\nexport default removeNonPrintingValuesTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZW1vdmVOb25QcmludGluZ1ZhbHVlc1RyYW5zZm9ybWVyL3JlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXIuanMiXSwibmFtZXMiOlsiaXNWYWxpZFZhbHVlIiwieCIsIk51bWJlciIsImlzTmFOIiwicmVtb3ZlTm9uUHJpbnRpbmdWYWx1ZXNUcmFuc2Zvcm1lciIsIm9uU3Vic3RpdHV0aW9uIiwic3Vic3RpdHV0aW9uIiwiQXJyYXkiLCJpc0FycmF5IiwiZmlsdGVyIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSxlQUFlLFNBQWZBLFlBQWU7QUFBQSxTQUNuQkMsS0FBSyxJQUFMLElBQWEsQ0FBQ0MsT0FBT0MsS0FBUCxDQUFhRixDQUFiLENBQWQsSUFBaUMsT0FBT0EsQ0FBUCxLQUFhLFNBRDNCO0FBQUEsQ0FBckI7O0FBR0EsSUFBTUcscUNBQXFDLFNBQXJDQSxrQ0FBcUM7QUFBQSxTQUFPO0FBQ2hEQyxrQkFEZ0QsMEJBQ2pDQyxZQURpQyxFQUNuQjtBQUMzQixVQUFJQyxNQUFNQyxPQUFOLENBQWNGLFlBQWQsQ0FBSixFQUFpQztBQUMvQixlQUFPQSxhQUFhRyxNQUFiLENBQW9CVCxZQUFwQixDQUFQO0FBQ0Q7QUFDRCxVQUFJQSxhQUFhTSxZQUFiLENBQUosRUFBZ0M7QUFDOUIsZUFBT0EsWUFBUDtBQUNEO0FBQ0QsYUFBTyxFQUFQO0FBQ0Q7QUFUK0MsR0FBUDtBQUFBLENBQTNDOztBQVlBLGVBQWVGLGtDQUFmIiwiZmlsZSI6InJlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBpc1ZhbGlkVmFsdWUgPSB4ID0+XG4gIHggIT0gbnVsbCAmJiAhTnVtYmVyLmlzTmFOKHgpICYmIHR5cGVvZiB4ICE9PSAnYm9vbGVhbic7XG5cbmNvbnN0IHJlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXIgPSAoKSA9PiAoe1xuICBvblN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzdWJzdGl0dXRpb24pKSB7XG4gICAgICByZXR1cm4gc3Vic3RpdHV0aW9uLmZpbHRlcihpc1ZhbGlkVmFsdWUpO1xuICAgIH1cbiAgICBpZiAoaXNWYWxpZFZhbHVlKHN1YnN0aXR1dGlvbikpIHtcbiAgICAgIHJldHVybiBzdWJzdGl0dXRpb247XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfSxcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCByZW1vdmVOb25QcmludGluZ1ZhbHVlc1RyYW5zZm9ybWVyO1xuIl19","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar commaLists = new TemplateTag(inlineArrayTransformer({ separator: ',' }), stripIndentTransformer, trimResultTransformer);\n\nexport default commaLists;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYUxpc3RzL2NvbW1hTGlzdHMuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJzdHJpcEluZGVudFRyYW5zZm9ybWVyIiwiaW5saW5lQXJyYXlUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsImNvbW1hTGlzdHMiLCJzZXBhcmF0b3IiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFdBQVAsTUFBd0IsZ0JBQXhCO0FBQ0EsT0FBT0Msc0JBQVAsTUFBbUMsMkJBQW5DO0FBQ0EsT0FBT0Msc0JBQVAsTUFBbUMsMkJBQW5DO0FBQ0EsT0FBT0MscUJBQVAsTUFBa0MsMEJBQWxDOztBQUVBLElBQU1DLGFBQWEsSUFBSUosV0FBSixDQUNqQkUsdUJBQXVCLEVBQUVHLFdBQVcsR0FBYixFQUF2QixDQURpQixFQUVqQkosc0JBRmlCLEVBR2pCRSxxQkFIaUIsQ0FBbkI7O0FBTUEsZUFBZUMsVUFBZiIsImZpbGUiOiJjb21tYUxpc3RzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBzdHJpcEluZGVudFRyYW5zZm9ybWVyIGZyb20gJy4uL3N0cmlwSW5kZW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgZnJvbSAnLi4vaW5saW5lQXJyYXlUcmFuc2Zvcm1lcic7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5cbmNvbnN0IGNvbW1hTGlzdHMgPSBuZXcgVGVtcGxhdGVUYWcoXG4gIGlubGluZUFycmF5VHJhbnNmb3JtZXIoeyBzZXBhcmF0b3I6ICcsJyB9KSxcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgY29tbWFMaXN0cztcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar commaListsAnd = new TemplateTag(inlineArrayTransformer({ separator: ',', conjunction: 'and' }), stripIndentTransformer, trimResultTransformer);\n\nexport default commaListsAnd;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYUxpc3RzQW5kL2NvbW1hTGlzdHNBbmQuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJzdHJpcEluZGVudFRyYW5zZm9ybWVyIiwiaW5saW5lQXJyYXlUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsImNvbW1hTGlzdHNBbmQiLCJzZXBhcmF0b3IiLCJjb25qdW5jdGlvbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7O0FBRUEsSUFBTUMsZ0JBQWdCLElBQUlKLFdBQUosQ0FDcEJFLHVCQUF1QixFQUFFRyxXQUFXLEdBQWIsRUFBa0JDLGFBQWEsS0FBL0IsRUFBdkIsQ0FEb0IsRUFFcEJMLHNCQUZvQixFQUdwQkUscUJBSG9CLENBQXRCOztBQU1BLGVBQWVDLGFBQWYiLCJmaWxlIjoiY29tbWFMaXN0c0FuZC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciBmcm9tICcuLi9zdHJpcEluZGVudFRyYW5zZm9ybWVyJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBjb21tYUxpc3RzQW5kID0gbmV3IFRlbXBsYXRlVGFnKFxuICBpbmxpbmVBcnJheVRyYW5zZm9ybWVyKHsgc2VwYXJhdG9yOiAnLCcsIGNvbmp1bmN0aW9uOiAnYW5kJyB9KSxcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgY29tbWFMaXN0c0FuZDtcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar commaListsOr = new TemplateTag(inlineArrayTransformer({ separator: ',', conjunction: 'or' }), stripIndentTransformer, trimResultTransformer);\n\nexport default commaListsOr;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYUxpc3RzT3IvY29tbWFMaXN0c09yLmpzIl0sIm5hbWVzIjpbIlRlbXBsYXRlVGFnIiwic3RyaXBJbmRlbnRUcmFuc2Zvcm1lciIsImlubGluZUFycmF5VHJhbnNmb3JtZXIiLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJjb21tYUxpc3RzT3IiLCJzZXBhcmF0b3IiLCJjb25qdW5jdGlvbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7O0FBRUEsSUFBTUMsZUFBZSxJQUFJSixXQUFKLENBQ25CRSx1QkFBdUIsRUFBRUcsV0FBVyxHQUFiLEVBQWtCQyxhQUFhLElBQS9CLEVBQXZCLENBRG1CLEVBRW5CTCxzQkFGbUIsRUFHbkJFLHFCQUhtQixDQUFyQjs7QUFNQSxlQUFlQyxZQUFmIiwiZmlsZSI6ImNvbW1hTGlzdHNPci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciBmcm9tICcuLi9zdHJpcEluZGVudFRyYW5zZm9ybWVyJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBjb21tYUxpc3RzT3IgPSBuZXcgVGVtcGxhdGVUYWcoXG4gIGlubGluZUFycmF5VHJhbnNmb3JtZXIoeyBzZXBhcmF0b3I6ICcsJywgY29uanVuY3Rpb246ICdvcicgfSksXG4gIHN0cmlwSW5kZW50VHJhbnNmb3JtZXIsXG4gIHRyaW1SZXN1bHRUcmFuc2Zvcm1lcixcbik7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbW1hTGlzdHNPcjtcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport splitStringTransformer from '../splitStringTransformer';\nimport removeNonPrintingValuesTransformer from '../removeNonPrintingValuesTransformer';\n\nvar html = new TemplateTag(splitStringTransformer('\\n'), removeNonPrintingValuesTransformer, inlineArrayTransformer, stripIndentTransformer, trimResultTransformer);\n\nexport default html;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9odG1sL2h0bWwuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJzdHJpcEluZGVudFRyYW5zZm9ybWVyIiwiaW5saW5lQXJyYXlUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInNwbGl0U3RyaW5nVHJhbnNmb3JtZXIiLCJyZW1vdmVOb25QcmludGluZ1ZhbHVlc1RyYW5zZm9ybWVyIiwiaHRtbCJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxrQ0FBUCxNQUErQyx1Q0FBL0M7O0FBRUEsSUFBTUMsT0FBTyxJQUFJTixXQUFKLENBQ1hJLHVCQUF1QixJQUF2QixDQURXLEVBRVhDLGtDQUZXLEVBR1hILHNCQUhXLEVBSVhELHNCQUpXLEVBS1hFLHFCQUxXLENBQWI7O0FBUUEsZUFBZUcsSUFBZiIsImZpbGUiOiJodG1sLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBzdHJpcEluZGVudFRyYW5zZm9ybWVyIGZyb20gJy4uL3N0cmlwSW5kZW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgZnJvbSAnLi4vaW5saW5lQXJyYXlUcmFuc2Zvcm1lcic7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5pbXBvcnQgc3BsaXRTdHJpbmdUcmFuc2Zvcm1lciBmcm9tICcuLi9zcGxpdFN0cmluZ1RyYW5zZm9ybWVyJztcbmltcG9ydCByZW1vdmVOb25QcmludGluZ1ZhbHVlc1RyYW5zZm9ybWVyIGZyb20gJy4uL3JlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXInO1xuXG5jb25zdCBodG1sID0gbmV3IFRlbXBsYXRlVGFnKFxuICBzcGxpdFN0cmluZ1RyYW5zZm9ybWVyKCdcXG4nKSxcbiAgcmVtb3ZlTm9uUHJpbnRpbmdWYWx1ZXNUcmFuc2Zvcm1lcixcbiAgaW5saW5lQXJyYXlUcmFuc2Zvcm1lcixcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgaHRtbDtcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport splitStringTransformer from '../splitStringTransformer';\nimport replaceSubstitutionTransformer from '../replaceSubstitutionTransformer';\n\nvar safeHtml = new TemplateTag(splitStringTransformer('\\n'), inlineArrayTransformer, stripIndentTransformer, trimResultTransformer, replaceSubstitutionTransformer(/&/g, '&amp;'), replaceSubstitutionTransformer(/</g, '&lt;'), replaceSubstitutionTransformer(/>/g, '&gt;'), replaceSubstitutionTransformer(/\"/g, '&quot;'), replaceSubstitutionTransformer(/'/g, '&#x27;'), replaceSubstitutionTransformer(/`/g, '&#x60;'));\n\nexport default safeHtml;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zYWZlSHRtbC9zYWZlSHRtbC5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInN0cmlwSW5kZW50VHJhbnNmb3JtZXIiLCJpbmxpbmVBcnJheVRyYW5zZm9ybWVyIiwidHJpbVJlc3VsdFRyYW5zZm9ybWVyIiwic3BsaXRTdHJpbmdUcmFuc2Zvcm1lciIsInJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lciIsInNhZmVIdG1sIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLDhCQUFQLE1BQTJDLG1DQUEzQzs7QUFFQSxJQUFNQyxXQUFXLElBQUlOLFdBQUosQ0FDZkksdUJBQXVCLElBQXZCLENBRGUsRUFFZkYsc0JBRmUsRUFHZkQsc0JBSGUsRUFJZkUscUJBSmUsRUFLZkUsK0JBQStCLElBQS9CLEVBQXFDLE9BQXJDLENBTGUsRUFNZkEsK0JBQStCLElBQS9CLEVBQXFDLE1BQXJDLENBTmUsRUFPZkEsK0JBQStCLElBQS9CLEVBQXFDLE1BQXJDLENBUGUsRUFRZkEsK0JBQStCLElBQS9CLEVBQXFDLFFBQXJDLENBUmUsRUFTZkEsK0JBQStCLElBQS9CLEVBQXFDLFFBQXJDLENBVGUsRUFVZkEsK0JBQStCLElBQS9CLEVBQXFDLFFBQXJDLENBVmUsQ0FBakI7O0FBYUEsZUFBZUMsUUFBZiIsImZpbGUiOiJzYWZlSHRtbC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciBmcm9tICcuLi9zdHJpcEluZGVudFRyYW5zZm9ybWVyJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuaW1wb3J0IHNwbGl0U3RyaW5nVHJhbnNmb3JtZXIgZnJvbSAnLi4vc3BsaXRTdHJpbmdUcmFuc2Zvcm1lcic7XG5pbXBvcnQgcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyIGZyb20gJy4uL3JlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lcic7XG5cbmNvbnN0IHNhZmVIdG1sID0gbmV3IFRlbXBsYXRlVGFnKFxuICBzcGxpdFN0cmluZ1RyYW5zZm9ybWVyKCdcXG4nKSxcbiAgaW5saW5lQXJyYXlUcmFuc2Zvcm1lcixcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuICByZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIoLyYvZywgJyZhbXA7JyksXG4gIHJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lcigvPC9nLCAnJmx0OycpLFxuICByZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIoLz4vZywgJyZndDsnKSxcbiAgcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyKC9cIi9nLCAnJnF1b3Q7JyksXG4gIHJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lcigvJy9nLCAnJiN4Mjc7JyksXG4gIHJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lcigvYC9nLCAnJiN4NjA7JyksXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBzYWZlSHRtbDtcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLine = new TemplateTag(replaceResultTransformer(/(?:\\n(?:\\s*))+/g, ' '), trimResultTransformer);\n\nexport default oneLine;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lL29uZUxpbmUuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJyZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIiLCJvbmVMaW5lIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHdCQUFQLE1BQXFDLDZCQUFyQzs7QUFFQSxJQUFNQyxVQUFVLElBQUlILFdBQUosQ0FDZEUseUJBQXlCLGlCQUF6QixFQUE0QyxHQUE1QyxDQURjLEVBRWRELHFCQUZjLENBQWhCOztBQUtBLGVBQWVFLE9BQWYiLCJmaWxlIjoib25lTGluZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5pbXBvcnQgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3JlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lcic7XG5cbmNvbnN0IG9uZUxpbmUgPSBuZXcgVGVtcGxhdGVUYWcoXG4gIHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lcigvKD86XFxuKD86XFxzKikpKy9nLCAnICcpLFxuICB0cmltUmVzdWx0VHJhbnNmb3JtZXIsXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBvbmVMaW5lO1xuIl19","import TemplateTag from '../TemplateTag';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineTrim = new TemplateTag(replaceResultTransformer(/(?:\\n\\s*)/g, ''), trimResultTransformer);\n\nexport default oneLineTrim;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lVHJpbS9vbmVMaW5lVHJpbS5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciIsIm9uZUxpbmVUcmltIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHdCQUFQLE1BQXFDLDZCQUFyQzs7QUFFQSxJQUFNQyxjQUFjLElBQUlILFdBQUosQ0FDbEJFLHlCQUF5QixZQUF6QixFQUF1QyxFQUF2QyxDQURrQixFQUVsQkQscUJBRmtCLENBQXBCOztBQUtBLGVBQWVFLFdBQWYiLCJmaWxlIjoib25lTGluZVRyaW0uanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVGVtcGxhdGVUYWcgZnJvbSAnLi4vVGVtcGxhdGVUYWcnO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuaW1wb3J0IHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi9yZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBvbmVMaW5lVHJpbSA9IG5ldyBUZW1wbGF0ZVRhZyhcbiAgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyKC8oPzpcXG5cXHMqKS9nLCAnJyksXG4gIHRyaW1SZXN1bHRUcmFuc2Zvcm1lcixcbik7XG5cbmV4cG9ydCBkZWZhdWx0IG9uZUxpbmVUcmltO1xuIl19","import TemplateTag from '../TemplateTag';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineCommaLists = new TemplateTag(inlineArrayTransformer({ separator: ',' }), replaceResultTransformer(/(?:\\s+)/g, ' '), trimResultTransformer);\n\nexport default oneLineCommaLists;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lQ29tbWFMaXN0cy9vbmVMaW5lQ29tbWFMaXN0cy5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsImlubGluZUFycmF5VHJhbnNmb3JtZXIiLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJyZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIiLCJvbmVMaW5lQ29tbWFMaXN0cyIsInNlcGFyYXRvciJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7QUFDQSxPQUFPQyx3QkFBUCxNQUFxQyw2QkFBckM7O0FBRUEsSUFBTUMsb0JBQW9CLElBQUlKLFdBQUosQ0FDeEJDLHVCQUF1QixFQUFFSSxXQUFXLEdBQWIsRUFBdkIsQ0FEd0IsRUFFeEJGLHlCQUF5QixVQUF6QixFQUFxQyxHQUFyQyxDQUZ3QixFQUd4QkQscUJBSHdCLENBQTFCOztBQU1BLGVBQWVFLGlCQUFmIiwiZmlsZSI6Im9uZUxpbmVDb21tYUxpc3RzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuaW1wb3J0IHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi9yZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBvbmVMaW5lQ29tbWFMaXN0cyA9IG5ldyBUZW1wbGF0ZVRhZyhcbiAgaW5saW5lQXJyYXlUcmFuc2Zvcm1lcih7IHNlcGFyYXRvcjogJywnIH0pLFxuICByZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIoLyg/OlxccyspL2csICcgJyksXG4gIHRyaW1SZXN1bHRUcmFuc2Zvcm1lcixcbik7XG5cbmV4cG9ydCBkZWZhdWx0IG9uZUxpbmVDb21tYUxpc3RzO1xuIl19","import TemplateTag from '../TemplateTag';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineCommaListsOr = new TemplateTag(inlineArrayTransformer({ separator: ',', conjunction: 'or' }), replaceResultTransformer(/(?:\\s+)/g, ' '), trimResultTransformer);\n\nexport default oneLineCommaListsOr;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lQ29tbWFMaXN0c09yL29uZUxpbmVDb21tYUxpc3RzT3IuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJpbmxpbmVBcnJheVRyYW5zZm9ybWVyIiwidHJpbVJlc3VsdFRyYW5zZm9ybWVyIiwicmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyIiwib25lTGluZUNvbW1hTGlzdHNPciIsInNlcGFyYXRvciIsImNvbmp1bmN0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHdCQUFQLE1BQXFDLDZCQUFyQzs7QUFFQSxJQUFNQyxzQkFBc0IsSUFBSUosV0FBSixDQUMxQkMsdUJBQXVCLEVBQUVJLFdBQVcsR0FBYixFQUFrQkMsYUFBYSxJQUEvQixFQUF2QixDQUQwQixFQUUxQkgseUJBQXlCLFVBQXpCLEVBQXFDLEdBQXJDLENBRjBCLEVBRzFCRCxxQkFIMEIsQ0FBNUI7O0FBTUEsZUFBZUUsbUJBQWYiLCJmaWxlIjoib25lTGluZUNvbW1hTGlzdHNPci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgaW5saW5lQXJyYXlUcmFuc2Zvcm1lciBmcm9tICcuLi9pbmxpbmVBcnJheVRyYW5zZm9ybWVyJztcbmltcG9ydCB0cmltUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi4vdHJpbVJlc3VsdFRyYW5zZm9ybWVyJztcbmltcG9ydCByZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi4vcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyJztcblxuY29uc3Qgb25lTGluZUNvbW1hTGlzdHNPciA9IG5ldyBUZW1wbGF0ZVRhZyhcbiAgaW5saW5lQXJyYXlUcmFuc2Zvcm1lcih7IHNlcGFyYXRvcjogJywnLCBjb25qdW5jdGlvbjogJ29yJyB9KSxcbiAgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyKC8oPzpcXHMrKS9nLCAnICcpLFxuICB0cmltUmVzdWx0VHJhbnNmb3JtZXIsXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBvbmVMaW5lQ29tbWFMaXN0c09yO1xuIl19","import TemplateTag from '../TemplateTag';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineCommaListsAnd = new TemplateTag(inlineArrayTransformer({ separator: ',', conjunction: 'and' }), replaceResultTransformer(/(?:\\s+)/g, ' '), trimResultTransformer);\n\nexport default oneLineCommaListsAnd;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lQ29tbWFMaXN0c0FuZC9vbmVMaW5lQ29tbWFMaXN0c0FuZC5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsImlubGluZUFycmF5VHJhbnNmb3JtZXIiLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJyZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIiLCJvbmVMaW5lQ29tbWFMaXN0c0FuZCIsInNlcGFyYXRvciIsImNvbmp1bmN0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHdCQUFQLE1BQXFDLDZCQUFyQzs7QUFFQSxJQUFNQyx1QkFBdUIsSUFBSUosV0FBSixDQUMzQkMsdUJBQXVCLEVBQUVJLFdBQVcsR0FBYixFQUFrQkMsYUFBYSxLQUEvQixFQUF2QixDQUQyQixFQUUzQkgseUJBQXlCLFVBQXpCLEVBQXFDLEdBQXJDLENBRjJCLEVBRzNCRCxxQkFIMkIsQ0FBN0I7O0FBTUEsZUFBZUUsb0JBQWYiLCJmaWxlIjoib25lTGluZUNvbW1hTGlzdHNBbmQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVGVtcGxhdGVUYWcgZnJvbSAnLi4vVGVtcGxhdGVUYWcnO1xuaW1wb3J0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgZnJvbSAnLi4vaW5saW5lQXJyYXlUcmFuc2Zvcm1lcic7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5pbXBvcnQgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3JlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lcic7XG5cbmNvbnN0IG9uZUxpbmVDb21tYUxpc3RzQW5kID0gbmV3IFRlbXBsYXRlVGFnKFxuICBpbmxpbmVBcnJheVRyYW5zZm9ybWVyKHsgc2VwYXJhdG9yOiAnLCcsIGNvbmp1bmN0aW9uOiAnYW5kJyB9KSxcbiAgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyKC8oPzpcXHMrKS9nLCAnICcpLFxuICB0cmltUmVzdWx0VHJhbnNmb3JtZXIsXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBvbmVMaW5lQ29tbWFMaXN0c0FuZDtcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar inlineLists = new TemplateTag(inlineArrayTransformer, stripIndentTransformer, trimResultTransformer);\n\nexport default inlineLists;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbmxpbmVMaXN0cy9pbmxpbmVMaXN0cy5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInN0cmlwSW5kZW50VHJhbnNmb3JtZXIiLCJpbmxpbmVBcnJheVRyYW5zZm9ybWVyIiwidHJpbVJlc3VsdFRyYW5zZm9ybWVyIiwiaW5saW5lTGlzdHMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFdBQVAsTUFBd0IsZ0JBQXhCO0FBQ0EsT0FBT0Msc0JBQVAsTUFBbUMsMkJBQW5DO0FBQ0EsT0FBT0Msc0JBQVAsTUFBbUMsMkJBQW5DO0FBQ0EsT0FBT0MscUJBQVAsTUFBa0MsMEJBQWxDOztBQUVBLElBQU1DLGNBQWMsSUFBSUosV0FBSixDQUNsQkUsc0JBRGtCLEVBRWxCRCxzQkFGa0IsRUFHbEJFLHFCQUhrQixDQUFwQjs7QUFNQSxlQUFlQyxXQUFmIiwiZmlsZSI6ImlubGluZUxpc3RzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBzdHJpcEluZGVudFRyYW5zZm9ybWVyIGZyb20gJy4uL3N0cmlwSW5kZW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgZnJvbSAnLi4vaW5saW5lQXJyYXlUcmFuc2Zvcm1lcic7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5cbmNvbnN0IGlubGluZUxpc3RzID0gbmV3IFRlbXBsYXRlVGFnKFxuICBpbmxpbmVBcnJheVRyYW5zZm9ybWVyLFxuICBzdHJpcEluZGVudFRyYW5zZm9ybWVyLFxuICB0cmltUmVzdWx0VHJhbnNmb3JtZXIsXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBpbmxpbmVMaXN0cztcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineInlineLists = new TemplateTag(inlineArrayTransformer, replaceResultTransformer(/(?:\\s+)/g, ' '), trimResultTransformer);\n\nexport default oneLineInlineLists;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lSW5saW5lTGlzdHMvb25lTGluZUlubGluZUxpc3RzLmpzIl0sIm5hbWVzIjpbIlRlbXBsYXRlVGFnIiwiaW5saW5lQXJyYXlUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciIsIm9uZUxpbmVJbmxpbmVMaXN0cyJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7QUFDQSxPQUFPQyx3QkFBUCxNQUFxQyw2QkFBckM7O0FBRUEsSUFBTUMscUJBQXFCLElBQUlKLFdBQUosQ0FDekJDLHNCQUR5QixFQUV6QkUseUJBQXlCLFVBQXpCLEVBQXFDLEdBQXJDLENBRnlCLEVBR3pCRCxxQkFIeUIsQ0FBM0I7O0FBTUEsZUFBZUUsa0JBQWYiLCJmaWxlIjoib25lTGluZUlubGluZUxpc3RzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuaW1wb3J0IHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi9yZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBvbmVMaW5lSW5saW5lTGlzdHMgPSBuZXcgVGVtcGxhdGVUYWcoXG4gIGlubGluZUFycmF5VHJhbnNmb3JtZXIsXG4gIHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lcigvKD86XFxzKykvZywgJyAnKSxcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgb25lTGluZUlubGluZUxpc3RzO1xuIl19","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar stripIndent = new TemplateTag(stripIndentTransformer, trimResultTransformer);\n\nexport default stripIndent;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJpcEluZGVudC9zdHJpcEluZGVudC5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInN0cmlwSW5kZW50VHJhbnNmb3JtZXIiLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJzdHJpcEluZGVudCJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7O0FBRUEsSUFBTUMsY0FBYyxJQUFJSCxXQUFKLENBQ2xCQyxzQkFEa0IsRUFFbEJDLHFCQUZrQixDQUFwQjs7QUFLQSxlQUFlQyxXQUFmIiwiZmlsZSI6InN0cmlwSW5kZW50LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBzdHJpcEluZGVudFRyYW5zZm9ybWVyIGZyb20gJy4uL3N0cmlwSW5kZW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBzdHJpcEluZGVudCA9IG5ldyBUZW1wbGF0ZVRhZyhcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgc3RyaXBJbmRlbnQ7XG4iXX0=","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar stripIndents = new TemplateTag(stripIndentTransformer('all'), trimResultTransformer);\n\nexport default stripIndents;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJpcEluZGVudHMvc3RyaXBJbmRlbnRzLmpzIl0sIm5hbWVzIjpbIlRlbXBsYXRlVGFnIiwic3RyaXBJbmRlbnRUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInN0cmlwSW5kZW50cyJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7O0FBRUEsSUFBTUMsZUFBZSxJQUFJSCxXQUFKLENBQ25CQyx1QkFBdUIsS0FBdkIsQ0FEbUIsRUFFbkJDLHFCQUZtQixDQUFyQjs7QUFLQSxlQUFlQyxZQUFmIiwiZmlsZSI6InN0cmlwSW5kZW50cy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciBmcm9tICcuLi9zdHJpcEluZGVudFRyYW5zZm9ybWVyJztcbmltcG9ydCB0cmltUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi4vdHJpbVJlc3VsdFRyYW5zZm9ybWVyJztcblxuY29uc3Qgc3RyaXBJbmRlbnRzID0gbmV3IFRlbXBsYXRlVGFnKFxuICBzdHJpcEluZGVudFRyYW5zZm9ybWVyKCdhbGwnKSxcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgc3RyaXBJbmRlbnRzO1xuIl19","import Box from \"@mui/material/Box\";\nimport { ReactFlowProvider } from \"@xyflow/react\";\nimport { forwardRef, Ref } from \"react\";\nimport type { Check, LineageDiffViewOptions } from \"../../api\";\nimport type { LineageViewRef } from \"../lineage/LineageViewOss\";\nimport { LineageViewOss as LineageView } from \"../lineage/LineageViewOss\";\n\nexport interface LineageDiffViewProps {\n check: Check;\n}\n\nfunction _LineageDiffView(\n { check }: LineageDiffViewProps,\n ref: Ref<LineageViewRef>,\n) {\n const viewOptions = {\n ...(check.params as Record<string, unknown>),\n ...(check.view_options as LineageDiffViewOptions),\n };\n\n return (\n <Box sx={{ display: \"flex\", flexDirection: \"column\", height: \"100%\" }}>\n <ReactFlowProvider>\n <LineageView viewOptions={viewOptions} interactive={false} ref={ref} />\n </ReactFlowProvider>\n </Box>\n );\n}\n\nexport const LineageDiffViewOss = forwardRef<\n LineageViewRef,\n LineageDiffViewProps\n>(_LineageDiffView);\n","\"use client\";\n\nimport Box from \"@mui/material/Box\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport React, { forwardRef, useMemo, useState } from \"react\";\nimport type { IconType } from \"react-icons\";\nimport type { LineageGraphNode } from \"../..\";\nimport { HSplit, isSchemaChanged } from \"../..\";\nimport { type Check, cacheKeys, select } from \"../../api\";\nimport { useLineageGraphContext } from \"../../contexts\";\nimport { useApiConfig, useIsDark } from \"../../hooks\";\nimport type { DataGridHandle } from \"../../primitives\";\nimport {\n getIconForChangeStatus,\n getIconForResourceType,\n type IconComponent,\n} from \"../lineage\";\nimport { findByRunType } from \"../run\";\nimport { SchemaView } from \"../schema\";\n\ninterface SchemaDiffViewProps {\n check: Check;\n}\n\nexport interface SchemaDiffParams {\n node_id?: string | string[];\n select?: string;\n exclude?: string;\n view_mode?: \"all\" | \"changed_models\";\n packages?: string[];\n}\n\nconst NodelistItem = ({\n node,\n selected,\n onSelect,\n schemaChanged,\n isDark,\n}: {\n node: LineageGraphNode;\n selected: boolean;\n onSelect: (nodeId: string) => void;\n schemaChanged: boolean;\n isDark: boolean;\n}) => {\n const { icon } = getIconForResourceType(node.data.resourceType);\n const { base, current } = node.data.data;\n\n let statusIcon: IconComponent | IconType | undefined;\n let statusColor: string | undefined;\n\n if (schemaChanged) {\n statusIcon = findByRunType(\"schema_diff\").icon;\n statusColor = getIconForChangeStatus(\"modified\").color;\n } else if (!base && current) {\n statusIcon = getIconForChangeStatus(\"added\").icon;\n statusColor = getIconForChangeStatus(\"added\").color;\n } else if (base && !current) {\n statusIcon = getIconForChangeStatus(\"removed\").icon;\n statusColor = getIconForChangeStatus(\"removed\").color;\n }\n\n return (\n <ListItem disablePadding>\n <Box\n sx={{\n display: \"flex\",\n width: \"100%\",\n fontSize: \"10pt\",\n p: \"5px 8px\",\n cursor: \"pointer\",\n \"&:hover\": { bgcolor: isDark ? \"grey.700\" : \"grey.200\" },\n bgcolor: selected ? (isDark ? \"grey.800\" : \"grey.100\") : \"inherit\",\n alignItems: \"center\",\n gap: \"5px\",\n }}\n onClick={() => {\n onSelect(node.id);\n }}\n >\n {icon && <Box component={icon} />}\n <Box\n sx={{\n flex: 1,\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n }}\n >\n {node.data.name}\n </Box>\n\n {statusIcon && statusColor && (\n <Box component={statusIcon} sx={{ color: statusColor }} />\n )}\n </Box>\n </ListItem>\n );\n};\n\nexport function PrivateSchemaDiffView(\n { check }: SchemaDiffViewProps,\n ref: React.Ref<DataGridHandle>,\n) {\n const isDark = useIsDark();\n const { apiClient } = useApiConfig();\n const { lineageGraph } = useLineageGraphContext();\n const params = check.params as SchemaDiffParams;\n\n const queryKey = [...cacheKeys.check(check.check_id), \"select\"];\n\n const { isLoading, error, data } = useQuery({\n queryKey,\n queryFn: async () =>\n select(\n {\n select: params.select,\n exclude: params.exclude,\n packages: params.packages,\n view_mode: params.view_mode,\n },\n apiClient,\n ),\n refetchOnMount: true,\n enabled: !params.node_id,\n });\n\n const [nodes, changedNodes] = useMemo(() => {\n const selectedNodes: LineageGraphNode[] = [];\n const changedNodes: string[] = [];\n const addedNodes: string[] = [];\n const removedNodes: string[] = [];\n\n if (params.node_id) {\n const nodeIds =\n params.node_id instanceof Array ? params.node_id : [params.node_id];\n for (const nodeId of nodeIds) {\n const node = lineageGraph?.nodes[nodeId];\n if (node) {\n selectedNodes.push(node);\n }\n }\n } else {\n for (const nodeId of data?.nodes ?? []) {\n const node = lineageGraph?.nodes[nodeId];\n if (node) {\n selectedNodes.push(node);\n }\n }\n }\n\n // filter that the resourec_type is mode,seed, source, or snapshot\n const filteredNodes = selectedNodes.filter(\n (node) =>\n node.data.resourceType === \"model\" ||\n node.data.resourceType === \"seed\" ||\n node.data.resourceType === \"source\" ||\n node.data.resourceType === \"snapshot\",\n );\n\n for (const node of filteredNodes) {\n if (\n isSchemaChanged(\n node.data.data.base?.columns,\n node.data.data.current?.columns,\n )\n ) {\n changedNodes.push(node.id);\n } else if (!node.data.data.base && node.data.data.current) {\n addedNodes.push(node.id);\n } else if (node.data.data.base && !node.data.data.current) {\n removedNodes.push(node.id);\n }\n }\n function sortScore(node: LineageGraphNode) {\n if (changedNodes.includes(node.id)) {\n return 3;\n }\n if (addedNodes.includes(node.id)) {\n return 2;\n }\n if (removedNodes.includes(node.id)) {\n return 1;\n }\n return 0;\n }\n\n //sort the selectedNodes from schemaChange and node name\n filteredNodes.sort((a, b) => {\n const scoreA = sortScore(a);\n const scoreB = sortScore(b);\n if (scoreA !== scoreB) {\n return scoreB - scoreA;\n } else {\n return a.data.name.localeCompare(b.data.name);\n }\n });\n\n return [filteredNodes, changedNodes];\n }, [params.node_id, data?.nodes, lineageGraph]);\n\n const [selected, setSelected] = useState<number>(0);\n\n if (isLoading) {\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n bgcolor: isDark ? \"grey.900\" : \"grey.50\",\n height: \"100%\",\n }}\n >\n Loading...\n </Box>\n );\n } else if (error) {\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n bgcolor: isDark ? \"grey.900\" : \"grey.50\",\n height: \"100%\",\n }}\n className=\"no-track-pii-safe\"\n >\n Error: {error.message}\n </Box>\n );\n } else if (nodes.length == 0) {\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n bgcolor: isDark ? \"grey.900\" : \"grey.50\",\n height: \"100%\",\n }}\n >\n No nodes matched\n </Box>\n );\n } else if (selected < nodes.length) {\n const node = nodes[selected];\n return (\n <HSplit sizes={[80, 20]} minSize={30} style={{ height: \"100%\" }}>\n <SchemaView\n base={node.data.data.base}\n current={node.data.data.current}\n enableScreenshot={true}\n showMenu={false}\n ref={ref}\n />\n <List\n sx={{\n overflow: \"auto\",\n bgcolor: \"background.paper\",\n listStyle: \"none\",\n }}\n >\n {nodes.map((node, i) => (\n <NodelistItem\n key={node.id}\n node={node}\n schemaChanged={changedNodes.includes(node.id)}\n selected={i === selected}\n isDark={isDark}\n onSelect={() => {\n setSelected(i);\n }}\n />\n ))}\n </List>\n </HSplit>\n );\n }\n\n // TODO: handle the edge case where the node is not found\n return <></>;\n}\n\nexport const SchemaDiffView = forwardRef(PrivateSchemaDiffView);\n","\"use client\";\n\nimport Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport MuiDialog from \"@mui/material/Dialog\";\nimport DialogActions from \"@mui/material/DialogActions\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport Divider from \"@mui/material/Divider\";\nimport Grid from \"@mui/material/Grid\";\nimport IconButton from \"@mui/material/IconButton\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport Menu from \"@mui/material/Menu\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport Stack from \"@mui/material/Stack\";\nimport { useTheme } from \"@mui/material/styles\";\nimport Tab from \"@mui/material/Tab\";\nimport Tabs from \"@mui/material/Tabs\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { stripIndents } from \"common-tags\";\nimport { formatDistanceToNow } from \"date-fns\";\nimport { useRouter } from \"next/navigation\";\nimport React, {\n type MouseEvent,\n ReactNode,\n Ref,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport { FaBookmark } from \"react-icons/fa6\";\nimport { IoMdCodeWorking } from \"react-icons/io\";\nimport { IoBookmarksOutline, IoClose } from \"react-icons/io5\";\nimport { PiCheckCircle, PiCopy, PiRepeat, PiTrashFill } from \"react-icons/pi\";\nimport { TbEdit } from \"react-icons/tb\";\nimport { VscCircleLarge, VscKebabVertical } from \"react-icons/vsc\";\nimport {\n type QueryDiffParams,\n type QueryParams,\n type QueryRunParams,\n} from \"../../api/adhocQuery\";\nimport { cacheKeys } from \"../../api/cacheKeys\";\nimport {\n type Check,\n deleteCheck,\n getCheck,\n markAsPresetCheck,\n updateCheck,\n} from \"../../api/checks\";\nimport { cancelRun, submitRunFromCheck } from \"../../api/runs\";\nimport type { Run, RunParamTypes } from \"../../api/types\";\nimport {\n useLineageGraphContext,\n useRecceInstanceContext,\n useRouteConfig,\n} from \"../../contexts\";\nimport {\n useApiConfig,\n useClipBoardToast,\n useCopyToClipboardButton,\n useIsDark,\n useRecceCheckContext,\n useRecceQueryContext,\n useRun,\n} from \"../../hooks\";\nimport { trackCopyToClipboard } from \"../../lib/api/track\";\nimport {\n buildCheckDescription,\n buildCheckTitle,\n CheckBreadcrumb,\n CheckDescription,\n formatSqlAsMarkdown,\n generateCheckTemplate,\n isDisabledByNoResult,\n PresetCheckTemplateView,\n} from \"../../primitives\";\nimport { VSplit } from \"..\";\nimport { SetupConnectionPopover } from \"../app\";\nimport type { LineageViewRef } from \"../lineage/LineageViewOss\";\nimport { DualSqlEditor, SqlEditor } from \"../query\";\nimport {\n findByRunType,\n type IconComponent,\n RefTypes,\n RegistryEntry,\n RunViewOss,\n ViewOptionTypes,\n} from \"../run\";\nimport { toaster } from \"../ui\";\nimport { LineageDiffViewOss as LineageDiffView } from \"./LineageDiffViewOss\";\nimport { SchemaDiffView } from \"./SchemaDiffView\";\nimport { CheckTimelineOss as CheckTimeline } from \"./timeline/CheckTimelineOss\";\n\ninterface CheckDetailProps {\n checkId: string;\n refreshCheckList?: () => void;\n}\n\ntype TabValueList = \"result\" | \"query\";\n\nexport function CheckDetailOss({\n checkId,\n refreshCheckList,\n}: CheckDetailProps): ReactNode {\n const theme = useTheme();\n const isDark = useIsDark();\n const { apiClient } = useApiConfig();\n const { featureToggles, sessionId } = useRecceInstanceContext();\n const { setLatestSelectedCheckId } = useRecceCheckContext();\n const { cloudMode } = useLineageGraphContext();\n const queryClient = useQueryClient();\n const router = useRouter();\n const { basePath } = useRouteConfig();\n const { setSqlQuery, setBaseSqlQuery, setCustomQueries, setPrimaryKeys } =\n useRecceQueryContext();\n const { successToast, failToast } = useClipBoardToast();\n const [submittedRunId, setSubmittedRunId] = useState<string>();\n const [progress] = useState<Run[\"progress\"]>();\n const [isAborting, setAborting] = useState(false);\n const [isPresetCheckTemplateOpen, setIsPresetCheckTemplateOpen] =\n useState(false);\n const [menuAnchorEl, setMenuAnchorEl] = useState<HTMLElement | null>(null);\n const menuOpen = Boolean(menuAnchorEl);\n\n const {\n isLoading,\n error,\n data: check,\n } = useQuery({\n queryKey: cacheKeys.check(checkId),\n queryFn: async () => getCheck(checkId, apiClient),\n refetchOnMount: true,\n });\n\n const trackedRunId = submittedRunId ?? check?.last_run?.run_id;\n const { run, error: rerunError } = useRun(trackedRunId);\n const isRunning = submittedRunId\n ? !run || run.status === \"Running\"\n : run?.status === \"Running\";\n\n const runTypeEntry = check?.type ? findByRunType(check.type) : undefined;\n\n let RunResultView: RegistryEntry[\"RunResultView\"] | undefined;\n if (runTypeEntry) {\n RunResultView =\n runTypeEntry.RunResultView as RegistryEntry[\"RunResultView\"];\n }\n\n const isPresetCheck = check?.is_preset ?? false;\n\n const lineageViewRef = useRef<LineageViewRef>(null);\n\n const { mutate } = useMutation({\n mutationFn: (check: Partial<Check>) =>\n updateCheck(checkId, check, apiClient),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: cacheKeys.check(checkId),\n });\n await queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });\n },\n });\n\n const { mutate: handleDelete } = useMutation({\n mutationFn: () => deleteCheck(checkId, apiClient),\n onSuccess: async () => {\n setLatestSelectedCheckId(\"\");\n await queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });\n router.push(`${basePath}/checks`);\n },\n });\n\n const { mutate: handleMarkAsPresetCheck, isPending: isMarkingAsPreset } =\n useMutation({\n mutationFn: async () => {\n if (!check) {\n throw new Error(\"Check not found\");\n }\n\n return await markAsPresetCheck(checkId, apiClient);\n },\n onSuccess: async () => {\n successToast(\"Check marked as preset successfully\");\n // Invalidate queries to refresh the check data\n await queryClient.invalidateQueries({\n queryKey: cacheKeys.check(checkId),\n });\n },\n onError: (error) => {\n failToast(\"Failed to mark check as preset\", error);\n },\n });\n\n const handleRerun = useCallback(async () => {\n const type = check?.type;\n if (!type) {\n return;\n }\n\n const submittedRun = await submitRunFromCheck(\n checkId,\n { nowait: true },\n apiClient,\n );\n setSubmittedRunId(submittedRun.run_id);\n await queryClient.invalidateQueries({ queryKey: cacheKeys.check(checkId) });\n if (refreshCheckList) refreshCheckList(); // refresh the checklist to fetch correct last run status\n }, [check, checkId, queryClient, refreshCheckList, apiClient]);\n\n const handleCancel = useCallback(async () => {\n setAborting(true);\n if (!trackedRunId) {\n return;\n }\n\n return await cancelRun(trackedRunId, apiClient);\n }, [trackedRunId, apiClient]);\n\n const handleCopy = async () => {\n if (!check) {\n return;\n }\n\n // Cast to Check<RunParamTypes> since we know the check params are valid\n const markdown = buildMarkdown(check as Check<RunParamTypes>);\n // @see https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts\n if (!window.isSecureContext) {\n failToast(\n \"Failed to copy the check to clipboard\",\n new Error(\n \"Copy to clipboard is available only in secure contexts (HTTPS)\",\n ),\n );\n return;\n }\n\n try {\n await navigator.clipboard.writeText(markdown);\n successToast(\"Copied the check to the clipboard\");\n } catch (err) {\n failToast(\"Failed to copy the check to clipboard\", err);\n }\n };\n\n const handleApproveCheck = useCallback(() => {\n const isChecked = check?.is_checked;\n mutate({ is_checked: !isChecked });\n if (!isChecked) {\n toaster.create({\n title: \"Marked as approved\",\n type: \"success\",\n duration: 2000,\n });\n }\n }, [check?.is_checked, mutate]);\n\n const handelUpdateViewOptions = (viewOptions: ViewOptionTypes) => {\n mutate({ view_options: viewOptions });\n };\n\n const handleUpdateDescription = (description?: string) => {\n mutate({ description });\n };\n\n const handleMenuClick = (event: MouseEvent<HTMLButtonElement>) => {\n setMenuAnchorEl(event.currentTarget);\n };\n\n const handleMenuClose = () => {\n setMenuAnchorEl(null);\n };\n\n const handleOpenQuery = useCallback(() => {\n if (!check) return;\n\n const params = check.params as QueryParams | QueryDiffParams;\n const sqlTemplate = params?.sql_template || \"\";\n\n // Set current SQL\n setSqlQuery(sqlTemplate);\n\n // Handle query_diff with custom queries (dual mode)\n if (\"base_sql_template\" in params && params.base_sql_template) {\n setBaseSqlQuery(params.base_sql_template);\n setCustomQueries(true);\n } else {\n setBaseSqlQuery(\"\"); // Clear stale base SQL from previous checks\n setCustomQueries(false);\n }\n\n // Set primary keys if available, otherwise clear stale primary keys\n if (\"primary_keys\" in params && params.primary_keys) {\n setPrimaryKeys(params.primary_keys);\n } else {\n setPrimaryKeys(undefined);\n }\n\n // Navigate to query page\n router.push(`${basePath}/query`);\n }, [\n check,\n router,\n basePath,\n setSqlQuery,\n setBaseSqlQuery,\n setCustomQueries,\n setPrimaryKeys,\n ]);\n\n const [tabValue, setTabValue] = useState<TabValueList>(\"result\");\n const { ref, onCopyToClipboard, onMouseEnter, onMouseLeave } =\n useCopyToClipboardButton();\n\n // Calculate during render instead of effect\n const presetCheckTemplate = generateCheckTemplate({\n name: check?.name ?? \"\",\n description: check?.description ?? \"\",\n type: check?.type ?? \"\",\n params: check?.params as Record<string, unknown>,\n viewOptions: check?.view_options as Record<string, unknown>,\n });\n\n if (isLoading) {\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n }}\n >\n Loading\n </Box>\n );\n }\n\n if (error) {\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n }}\n >\n Error: <span className=\"no-track-pii-safe\">{error.message}</span>\n </Box>\n );\n }\n\n if (!check) {\n return (\n <VSplit\n minSize={100}\n sizes={[30, 70]}\n style={{ height: \"100%\", width: \"100%\", maxHeight: \"100%\" }}\n >\n <Box\n style={{ contain: \"strict\" }}\n sx={{ display: \"flex\", flexDirection: \"column\" }}\n >\n <Box\n sx={{\n display: \"flex\",\n p: \"0px 16px\",\n alignItems: \"center\",\n height: 40,\n }}\n >\n <CheckBreadcrumb name=\"Check not found\" disabled />\n </Box>\n </Box>\n </VSplit>\n );\n }\n\n const relativeTime = run?.run_at\n ? formatDistanceToNow(new Date(run.run_at), { addSuffix: true })\n : null;\n\n // Get the icon for the check type\n const checkTypeIcon: IconComponent | undefined = runTypeEntry?.icon;\n\n return (\n <Grid\n spacing={0}\n container\n sx={{\n height: \"100%\",\n width: \"100%\",\n }}\n >\n <Grid size={{ xs: 12, md: cloudMode ? 9 : 12 }} sx={{ height: \"100%\" }}>\n <VSplit\n minSize={100}\n sizes={[40, 60]}\n style={{ height: \"100%\", width: \"100%\", maxHeight: \"100%\" }}\n >\n <Box\n sx={{\n height: \"100%\",\n contain: \"strict\",\n display: \"flex\",\n flexDirection: \"row\",\n }}\n >\n {/* Main content area - takes remaining space */}\n <Box\n sx={{\n flex: 1,\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n minWidth: 0,\n }}\n >\n {/* Title bar with icon, name, and actions */}\n <Box\n sx={{\n display: \"flex\",\n p: \"0px 16px\",\n alignItems: \"center\",\n height: 40,\n borderBottom: \"2px solid\",\n borderColor: isDark ? \"grey.700\" : \"grey.300\",\n }}\n >\n {/* Check type icon */}\n {checkTypeIcon && (\n <Box\n component={checkTypeIcon}\n sx={{ fontSize: 20, mr: 1, flexShrink: 0 }}\n />\n )}\n <CheckBreadcrumb\n name={check.name}\n onNameChange={(name) => {\n mutate({ name });\n }}\n />\n <Box sx={{ flexGrow: 1 }} />\n <Stack direction=\"row\" spacing={2} sx={{ mr: \"10px\" }}>\n {relativeTime && (\n <Box\n sx={{\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n fontSize: \"0.75rem\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n {relativeTime}\n </Box>\n )}\n\n {/* Preset label moved to the right */}\n {isPresetCheck && (\n <MuiTooltip title=\"This is a preset check\">\n <Box\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <FaBookmark\n size=\"1rem\"\n color={theme.palette.iochmara.dark}\n />\n </Box>\n </MuiTooltip>\n )}\n\n <IconButton size=\"small\" onClick={handleMenuClick}>\n <VscKebabVertical />\n </IconButton>\n <Menu\n anchorEl={menuAnchorEl}\n open={menuOpen}\n onClose={handleMenuClose}\n >\n {sessionId && (\n <MenuItem\n onClick={() => {\n handleMarkAsPresetCheck();\n handleMenuClose();\n }}\n disabled={isMarkingAsPreset || isPresetCheck}\n >\n <ListItemIcon>\n <IoBookmarksOutline />\n </ListItemIcon>\n <ListItemText>Mark as Preset Check</ListItemText>\n </MenuItem>\n )}\n <MenuItem\n onClick={() => {\n setIsPresetCheckTemplateOpen(true);\n handleMenuClose();\n }}\n >\n <ListItemIcon>\n <IoMdCodeWorking />\n </ListItemIcon>\n <ListItemText>Get Preset Check Template</ListItemText>\n </MenuItem>\n <MenuItem\n onClick={() => {\n handleCopy();\n handleMenuClose();\n }}\n >\n <ListItemIcon>\n <PiCopy />\n </ListItemIcon>\n <ListItemText>Copy Markdown</ListItemText>\n </MenuItem>\n <Divider />\n <MenuItem\n onClick={() => {\n handleDelete();\n handleMenuClose();\n }}\n disabled={featureToggles.disableUpdateChecklist}\n sx={{ color: \"error.main\" }}\n >\n <ListItemIcon sx={{ color: \"error.main\" }}>\n <PiTrashFill />\n </ListItemIcon>\n <ListItemText>Delete</ListItemText>\n </MenuItem>\n </Menu>\n\n <MuiTooltip\n title={\n isDisabledByNoResult({\n type: check.type,\n hasResult: !!run?.result,\n hasError: !!run?.error,\n })\n ? \"Run the check first\"\n : check.is_checked\n ? \"Remove approval\"\n : \"Mark as approved\"\n }\n placement=\"bottom-end\"\n >\n <Button\n size=\"small\"\n color={check.is_checked ? \"success\" : \"neutral\"}\n variant={check.is_checked ? \"contained\" : \"outlined\"}\n onClick={() => {\n handleApproveCheck();\n }}\n disabled={\n isDisabledByNoResult({\n type: check.type,\n hasResult: !!run?.result,\n hasError: !!run?.error,\n }) || featureToggles.disableUpdateChecklist\n }\n startIcon={\n check.is_checked ? (\n <PiCheckCircle />\n ) : (\n <VscCircleLarge\n style={{\n color: isDark\n ? theme.palette.grey[600]\n : theme.palette.grey[400],\n }}\n />\n )\n }\n sx={{ flex: \"0 0 auto\", textTransform: \"none\" }}\n >\n {check.is_checked ? \"Approved\" : \"Pending\"}\n </Button>\n </MuiTooltip>\n </Stack>\n </Box>\n\n {/* Description area */}\n <Box sx={{ flex: 1, p: \"8px 16px\", minHeight: 100 }}>\n <CheckDescription\n key={check.check_id}\n value={check.description}\n onChange={handleUpdateDescription}\n disabled={featureToggles.disableUpdateChecklist}\n />\n </Box>\n </Box>\n </Box>\n <Box style={{ contain: \"strict\" }}>\n <Box\n sx={{\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n borderBottom: 1,\n borderColor: \"divider\",\n height: 50,\n }}\n >\n <Tabs\n value={tabValue}\n onChange={(_, newValue) =>\n setTabValue(newValue as TabValueList)\n }\n >\n <Tab\n label=\"Result\"\n value=\"result\"\n sx={{ fontSize: \"0.75rem\", textTransform: \"none\" }}\n />\n {(check.type === \"query\" || check.type === \"query_diff\") && (\n <Tab\n label=\"Query\"\n value=\"query\"\n sx={{ fontSize: \"0.75rem\", textTransform: \"none\" }}\n />\n )}\n </Tabs>\n <Box sx={{ flexGrow: 1 }} />\n <Stack direction=\"row\" spacing={1} sx={{ mr: \"10px\" }}>\n {(check.type === \"query\" ||\n check.type === \"query_base\" ||\n check.type === \"query_diff\") && (\n <MuiTooltip title=\"Open in Query tab\">\n <Button\n variant=\"outlined\"\n color=\"neutral\"\n size=\"small\"\n onClick={handleOpenQuery}\n disabled={featureToggles.disableDatabaseQuery}\n startIcon={<TbEdit />}\n sx={{ textTransform: \"none\" }}\n >\n Open Query\n </Button>\n </MuiTooltip>\n )}\n {RunResultView && (\n <MuiTooltip title=\"Rerun\">\n <Button\n variant=\"outlined\"\n color=\"neutral\"\n size=\"small\"\n onClick={() => handleRerun()}\n disabled={\n featureToggles.disableDatabaseQuery || isRunning\n }\n startIcon={<PiRepeat />}\n sx={{ textTransform: \"none\" }}\n >\n {isRunning ? \"Running...\" : \"Rerun\"}\n </Button>\n </MuiTooltip>\n )}\n <Button\n variant=\"outlined\"\n color=\"neutral\"\n disabled={\n isDisabledByNoResult({\n type: check.type,\n hasResult: !!run?.result,\n hasError: !!run?.error,\n }) || tabValue !== \"result\"\n }\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n size=\"small\"\n onClick={async () => {\n if (check.type === \"lineage_diff\") {\n lineageViewRef.current?.copyToClipboard();\n } else {\n await onCopyToClipboard();\n }\n trackCopyToClipboard({ type: check.type, from: \"check\" });\n }}\n startIcon={<PiCopy />}\n sx={{ textTransform: \"none\" }}\n >\n Copy to Clipboard\n </Button>\n </Stack>\n </Box>\n <Box sx={{ flex: 1, contain: \"strict\" }}>\n {tabValue === \"result\" && (\n <Box sx={{ width: \"100%\", height: \"100%\" }}>\n {RunResultView &&\n (check.last_run || trackedRunId ? (\n <RunViewOss\n ref={ref as unknown as Ref<RefTypes>}\n isRunning={isRunning}\n isAborting={isAborting}\n run={\n trackedRunId\n ? run\n : // Cast from library Run to OSS Run\n (check.last_run as Run | undefined)\n }\n error={rerunError}\n progress={progress}\n RunResultView={RunResultView}\n viewOptions={check.view_options as ViewOptionTypes}\n onViewOptionsChanged={handelUpdateViewOptions}\n onCancel={handleCancel}\n onExecuteRun={handleRerun}\n />\n ) : (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n bgcolor: isDark ? \"grey.900\" : \"grey.50\",\n height: \"100%\",\n }}\n >\n <Stack spacing={2} alignItems=\"center\">\n <Box>\n This action is part of the initial preset and has\n not been performed yet. Once performed, the result\n will be shown here.\n </Box>\n <SetupConnectionPopover\n display={featureToggles.mode === \"metadata only\"}\n >\n <Button\n onClick={handleRerun}\n variant=\"contained\"\n size=\"small\"\n disabled={featureToggles.disableDatabaseQuery}\n >\n Run Query\n </Button>\n </SetupConnectionPopover>\n </Stack>\n </Box>\n ))}\n {check.type === \"schema_diff\" && (\n <SchemaDiffView\n key={check.check_id}\n check={check}\n ref={ref}\n />\n )}\n {check.type === \"lineage_diff\" && (\n <LineageDiffView\n key={check.check_id}\n check={check}\n ref={lineageViewRef}\n />\n )}\n </Box>\n )}\n {tabValue === \"query\" &&\n (check.type === \"query\" ||\n check.type === \"query_diff\" ||\n check.type === \"query_base\") && (\n <Box sx={{ height: \"100%\", width: \"100%\" }}>\n {(check.params as QueryParams).base_sql_template ? (\n <DualSqlEditor\n value={\n (check.params as QueryDiffParams).sql_template || \"\"\n }\n baseValue={\n (check.params as QueryDiffParams)\n .base_sql_template ?? \"\"\n }\n options={{ readOnly: true }}\n />\n ) : (\n <SqlEditor\n value={\n (check.params as QueryRunParams).sql_template || \"\"\n }\n options={{ readOnly: true }}\n />\n )}\n </Box>\n )}\n </Box>\n </Box>\n </Box>\n <MuiDialog\n open={isPresetCheckTemplateOpen}\n onClose={() => setIsPresetCheckTemplateOpen(false)}\n maxWidth=\"md\"\n fullWidth\n >\n <DialogTitle>Preset Check Template</DialogTitle>\n <DialogContent>\n <Typography variant=\"subtitle2\" fontWeight=\"bold\" sx={{ mb: 2 }}>\n Please{\" \"}\n <Typography\n component=\"span\"\n sx={{\n cursor: \"pointer\",\n \"&:hover\": { textDecoration: \"underline\" },\n color: \"primary.main\",\n }}\n onClick={async () => {\n await navigator.clipboard.writeText(presetCheckTemplate);\n successToast(\"Copied the template to the clipboard\");\n }}\n >\n copy\n </Typography>{\" \"}\n the following template and paste it into the{\" \"}\n <Box\n component=\"span\"\n sx={{ px: 0.5, bgcolor: \"error.light\", borderRadius: 0.5 }}\n >\n recce.yml\n </Box>{\" \"}\n file.\n </Typography>\n <PresetCheckTemplateView yamlTemplate={presetCheckTemplate} />\n </DialogContent>\n <DialogActions>\n <IconButton\n size=\"small\"\n onClick={() => setIsPresetCheckTemplateOpen(false)}\n sx={{ position: \"absolute\", top: 8, right: 8 }}\n >\n <IoClose />\n </IconButton>\n </DialogActions>\n </MuiDialog>\n </VSplit>\n </Grid>\n {/* Timeline/Activity panel - fixed 20% width, hidden on mobile */}\n {cloudMode && (\n <Grid\n size={3}\n sx={{\n height: \"100%\",\n overflow: \"hidden\",\n flexShrink: 0,\n display: { xs: \"none\", md: \"block\" },\n }}\n >\n <CheckTimeline checkId={checkId} />\n </Grid>\n )}\n </Grid>\n );\n}\n\nfunction buildMarkdown(check: Check<RunParamTypes>) {\n const title = buildCheckTitle({\n name: check.name,\n isChecked: check.is_checked,\n });\n return stripIndents`\n <details><summary>${title}</summary>\n\n ${buildBody(check)}\n\n </details>`;\n}\n\nfunction buildBody(check: Check<RunParamTypes>) {\n const description = buildCheckDescription({ description: check.description });\n if (check.type === \"query\" || check.type === \"query_diff\") {\n const params = check.params;\n const sqlTemplate =\n params && \"sql_template\" in params ? params.sql_template : \"\";\n return `${description}\\n\\n${formatSqlAsMarkdown({ sql: sqlTemplate })}`;\n }\n\n return description;\n}\n","\"use client\";\n\n/**\n * CheckEmptyStateOss - wrapper around CheckEmptyState primitive\n *\n * Adds business logic:\n * - API calls to create schema diff check\n * - Navigation after check creation\n * - Query cache invalidation\n */\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useRouter } from \"next/navigation\";\nimport { TbChecklist } from \"react-icons/tb\";\nimport { type Check, cacheKeys, createSchemaDiffCheck } from \"../../api\";\nimport { useRouteConfig } from \"../../contexts\";\nimport { useApiConfig } from \"../../hooks\";\nimport { CheckEmptyState as CheckEmptyStateUI } from \"../../primitives\";\n\nexport const CheckEmptyStateOss = () => {\n const queryClient = useQueryClient();\n const router = useRouter();\n const { apiClient } = useApiConfig();\n const { basePath } = useRouteConfig();\n\n const { mutate: createSchemaCheck, isPending } = useMutation({\n mutationFn: () =>\n createSchemaDiffCheck({ select: \"state:modified\" }, apiClient),\n onSuccess: async (check: Check) => {\n await queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });\n router.push(`${basePath}/checks/?id=${check.check_id}`);\n },\n });\n\n const handleCreateSchemaCheck = () => {\n createSchemaCheck();\n };\n\n return (\n <CheckEmptyStateUI\n title=\"No checks yet\"\n description=\"Checks help you validate data quality and catch issues.\"\n icon={<TbChecklist size={48} />}\n actionText=\"Create Schema Diff Check\"\n onAction={handleCreateSchemaCheck}\n isLoading={isPending}\n helperText=\"The schema checks compare modified models between environments to detect changes, additions, or removals.\"\n />\n );\n};\n","var isProduction = process.env.NODE_ENV === 'production';\nvar prefix = 'Invariant failed';\nfunction invariant(condition, message) {\n if (condition) {\n return;\n }\n if (isProduction) {\n throw new Error(prefix);\n }\n var provided = typeof message === 'function' ? message() : message;\n var value = provided ? \"\".concat(prefix, \": \").concat(provided) : prefix;\n throw new Error(value);\n}\n\nexport { invariant as default };\n","import invariant from 'tiny-invariant';\n\nvar getRect = function getRect(_ref) {\n var top = _ref.top,\n right = _ref.right,\n bottom = _ref.bottom,\n left = _ref.left;\n var width = right - left;\n var height = bottom - top;\n var rect = {\n top: top,\n right: right,\n bottom: bottom,\n left: left,\n width: width,\n height: height,\n x: left,\n y: top,\n center: {\n x: (right + left) / 2,\n y: (bottom + top) / 2\n }\n };\n return rect;\n};\nvar expand = function expand(target, expandBy) {\n return {\n top: target.top - expandBy.top,\n left: target.left - expandBy.left,\n bottom: target.bottom + expandBy.bottom,\n right: target.right + expandBy.right\n };\n};\nvar shrink = function shrink(target, shrinkBy) {\n return {\n top: target.top + shrinkBy.top,\n left: target.left + shrinkBy.left,\n bottom: target.bottom - shrinkBy.bottom,\n right: target.right - shrinkBy.right\n };\n};\n\nvar shift = function shift(target, shiftBy) {\n return {\n top: target.top + shiftBy.y,\n left: target.left + shiftBy.x,\n bottom: target.bottom + shiftBy.y,\n right: target.right + shiftBy.x\n };\n};\n\nvar noSpacing = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n};\nvar createBox = function createBox(_ref2) {\n var borderBox = _ref2.borderBox,\n _ref2$margin = _ref2.margin,\n margin = _ref2$margin === void 0 ? noSpacing : _ref2$margin,\n _ref2$border = _ref2.border,\n border = _ref2$border === void 0 ? noSpacing : _ref2$border,\n _ref2$padding = _ref2.padding,\n padding = _ref2$padding === void 0 ? noSpacing : _ref2$padding;\n var marginBox = getRect(expand(borderBox, margin));\n var paddingBox = getRect(shrink(borderBox, border));\n var contentBox = getRect(shrink(paddingBox, padding));\n return {\n marginBox: marginBox,\n borderBox: getRect(borderBox),\n paddingBox: paddingBox,\n contentBox: contentBox,\n margin: margin,\n border: border,\n padding: padding\n };\n};\n\nvar parse = function parse(raw) {\n var value = raw.slice(0, -2);\n var suffix = raw.slice(-2);\n\n if (suffix !== 'px') {\n return 0;\n }\n\n var result = Number(value);\n !!isNaN(result) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Could not parse value [raw: \" + raw + \", without suffix: \" + value + \"]\") : invariant(false) : void 0;\n return result;\n};\n\nvar getWindowScroll = function getWindowScroll() {\n return {\n x: window.pageXOffset,\n y: window.pageYOffset\n };\n};\n\nvar offset = function offset(original, change) {\n var borderBox = original.borderBox,\n border = original.border,\n margin = original.margin,\n padding = original.padding;\n var shifted = shift(borderBox, change);\n return createBox({\n borderBox: shifted,\n border: border,\n margin: margin,\n padding: padding\n });\n};\nvar withScroll = function withScroll(original, scroll) {\n if (scroll === void 0) {\n scroll = getWindowScroll();\n }\n\n return offset(original, scroll);\n};\nvar calculateBox = function calculateBox(borderBox, styles) {\n var margin = {\n top: parse(styles.marginTop),\n right: parse(styles.marginRight),\n bottom: parse(styles.marginBottom),\n left: parse(styles.marginLeft)\n };\n var padding = {\n top: parse(styles.paddingTop),\n right: parse(styles.paddingRight),\n bottom: parse(styles.paddingBottom),\n left: parse(styles.paddingLeft)\n };\n var border = {\n top: parse(styles.borderTopWidth),\n right: parse(styles.borderRightWidth),\n bottom: parse(styles.borderBottomWidth),\n left: parse(styles.borderLeftWidth)\n };\n return createBox({\n borderBox: borderBox,\n margin: margin,\n padding: padding,\n border: border\n });\n};\nvar getBox = function getBox(el) {\n var borderBox = el.getBoundingClientRect();\n var styles = window.getComputedStyle(el);\n return calculateBox(borderBox, styles);\n};\n\nexport { calculateBox, createBox, expand, getBox, getRect, offset, shrink, withScroll };\n","var rafSchd = function rafSchd(fn) {\n var lastArgs = [];\n var frameId = null;\n\n var wrapperFn = function wrapperFn() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n lastArgs = args;\n\n if (frameId) {\n return;\n }\n\n frameId = requestAnimationFrame(function () {\n frameId = null;\n fn.apply(void 0, lastArgs);\n });\n };\n\n wrapperFn.cancel = function () {\n if (!frameId) {\n return;\n }\n\n cancelAnimationFrame(frameId);\n frameId = null;\n };\n\n return wrapperFn;\n};\n\nexport default rafSchd;\n","import React, { useState, useRef, useEffect, useLayoutEffect, useContext } from 'react';\nimport ReactDOM, { flushSync } from 'react-dom';\nimport { createStore as createStore$1, compose, applyMiddleware, bindActionCreators } from 'redux';\nimport { Provider, connect } from 'react-redux';\nimport { getRect, expand, offset, withScroll, calculateBox, getBox, createBox } from 'css-box-model';\nimport rafSchd from 'raf-schd';\nimport _extends from '@babel/runtime/helpers/esm/extends';\n\nconst isProduction$1 = process.env.NODE_ENV === 'production';\nconst spacesAndTabs = /[ \\t]{2,}/g;\nconst lineStartWithSpaces = /^[ \\t]*/gm;\nconst clean$2 = value => value.replace(spacesAndTabs, ' ').replace(lineStartWithSpaces, '').trim();\nconst getDevMessage = message => clean$2(`\n %c@hello-pangea/dnd\n\n %c${clean$2(message)}\n\n %c👷‍ This is a development only message. It will be removed in production builds.\n`);\nconst getFormattedMessage = message => [getDevMessage(message), 'color: #00C584; font-size: 1.2em; font-weight: bold;', 'line-height: 1.5', 'color: #723874;'];\nconst isDisabledFlag = '__@hello-pangea/dnd-disable-dev-warnings';\nfunction log(type, message) {\n if (isProduction$1) {\n return;\n }\n if (typeof window !== 'undefined' && window[isDisabledFlag]) {\n return;\n }\n console[type](...getFormattedMessage(message));\n}\nconst warning = log.bind(null, 'warn');\nconst error = log.bind(null, 'error');\n\nfunction noop$2() {}\n\nfunction getOptions(shared, fromBinding) {\n return {\n ...shared,\n ...fromBinding\n };\n}\nfunction bindEvents(el, bindings, sharedOptions) {\n const unbindings = bindings.map(binding => {\n const options = getOptions(sharedOptions, binding.options);\n el.addEventListener(binding.eventName, binding.fn, options);\n return function unbind() {\n el.removeEventListener(binding.eventName, binding.fn, options);\n };\n });\n return function unbindAll() {\n unbindings.forEach(unbind => {\n unbind();\n });\n };\n}\n\nconst isProduction = process.env.NODE_ENV === 'production';\nconst prefix$1 = 'Invariant failed';\nclass RbdInvariant extends Error {}\nRbdInvariant.prototype.toString = function toString() {\n return this.message;\n};\nfunction invariant(condition, message) {\n if (isProduction) {\n throw new RbdInvariant(prefix$1);\n } else {\n throw new RbdInvariant(`${prefix$1}: ${message || ''}`);\n }\n}\n\nclass ErrorBoundary extends React.Component {\n constructor(...args) {\n super(...args);\n this.callbacks = null;\n this.unbind = noop$2;\n this.onWindowError = event => {\n const callbacks = this.getCallbacks();\n if (callbacks.isDragging()) {\n callbacks.tryAbort();\n process.env.NODE_ENV !== \"production\" ? warning(`\n An error was caught by our window 'error' event listener while a drag was occurring.\n The active drag has been aborted.\n `) : void 0;\n }\n const err = event.error;\n if (err instanceof RbdInvariant) {\n event.preventDefault();\n if (process.env.NODE_ENV !== 'production') {\n error(err.message);\n }\n }\n };\n this.getCallbacks = () => {\n if (!this.callbacks) {\n throw new Error('Unable to find AppCallbacks in <ErrorBoundary/>');\n }\n return this.callbacks;\n };\n this.setCallbacks = callbacks => {\n this.callbacks = callbacks;\n };\n }\n componentDidMount() {\n this.unbind = bindEvents(window, [{\n eventName: 'error',\n fn: this.onWindowError\n }]);\n }\n componentDidCatch(err) {\n if (err instanceof RbdInvariant) {\n if (process.env.NODE_ENV !== 'production') {\n error(err.message);\n }\n this.setState({});\n return;\n }\n throw err;\n }\n componentWillUnmount() {\n this.unbind();\n }\n render() {\n return this.props.children(this.setCallbacks);\n }\n}\n\nconst dragHandleUsageInstructions = `\n Press space bar to start a drag.\n When dragging you can use the arrow keys to move the item around and escape to cancel.\n Some screen readers may require you to be in focus mode or to use your pass through key\n`;\nconst position = index => index + 1;\nconst onDragStart = start => `\n You have lifted an item in position ${position(start.source.index)}\n`;\nconst withLocation = (source, destination) => {\n const isInHomeList = source.droppableId === destination.droppableId;\n const startPosition = position(source.index);\n const endPosition = position(destination.index);\n if (isInHomeList) {\n return `\n You have moved the item from position ${startPosition}\n to position ${endPosition}\n `;\n }\n return `\n You have moved the item from position ${startPosition}\n in list ${source.droppableId}\n to list ${destination.droppableId}\n in position ${endPosition}\n `;\n};\nconst withCombine = (id, source, combine) => {\n const inHomeList = source.droppableId === combine.droppableId;\n if (inHomeList) {\n return `\n The item ${id}\n has been combined with ${combine.draggableId}`;\n }\n return `\n The item ${id}\n in list ${source.droppableId}\n has been combined with ${combine.draggableId}\n in list ${combine.droppableId}\n `;\n};\nconst onDragUpdate = update => {\n const location = update.destination;\n if (location) {\n return withLocation(update.source, location);\n }\n const combine = update.combine;\n if (combine) {\n return withCombine(update.draggableId, update.source, combine);\n }\n return 'You are over an area that cannot be dropped on';\n};\nconst returnedToStart = source => `\n The item has returned to its starting position\n of ${position(source.index)}\n`;\nconst onDragEnd = result => {\n if (result.reason === 'CANCEL') {\n return `\n Movement cancelled.\n ${returnedToStart(result.source)}\n `;\n }\n const location = result.destination;\n const combine = result.combine;\n if (location) {\n return `\n You have dropped the item.\n ${withLocation(result.source, location)}\n `;\n }\n if (combine) {\n return `\n You have dropped the item.\n ${withCombine(result.draggableId, result.source, combine)}\n `;\n }\n return `\n The item has been dropped while not over a drop area.\n ${returnedToStart(result.source)}\n `;\n};\nconst preset = {\n dragHandleUsageInstructions,\n onDragStart,\n onDragUpdate,\n onDragEnd\n};\n\nfunction isEqual$2(first, second) {\n if (first === second) {\n return true;\n }\n if (Number.isNaN(first) && Number.isNaN(second)) {\n return true;\n }\n return false;\n}\nfunction areInputsEqual(newInputs, lastInputs) {\n if (newInputs.length !== lastInputs.length) {\n return false;\n }\n for (let i = 0; i < newInputs.length; i++) {\n if (!isEqual$2(newInputs[i], lastInputs[i])) {\n return false;\n }\n }\n return true;\n}\n\nfunction useMemo(getResult, inputs) {\n const initial = useState(() => ({\n inputs,\n result: getResult()\n }))[0];\n const isFirstRun = useRef(true);\n const committed = useRef(initial);\n const useCache = isFirstRun.current || Boolean(inputs && committed.current.inputs && areInputsEqual(inputs, committed.current.inputs));\n const cache = useCache ? committed.current : {\n inputs,\n result: getResult()\n };\n useEffect(() => {\n isFirstRun.current = false;\n committed.current = cache;\n }, [cache]);\n return cache.result;\n}\nfunction useCallback(callback, inputs) {\n return useMemo(() => callback, inputs);\n}\n\nconst origin = {\n x: 0,\n y: 0\n};\nconst add = (point1, point2) => ({\n x: point1.x + point2.x,\n y: point1.y + point2.y\n});\nconst subtract = (point1, point2) => ({\n x: point1.x - point2.x,\n y: point1.y - point2.y\n});\nconst isEqual$1 = (point1, point2) => point1.x === point2.x && point1.y === point2.y;\nconst negate = point => ({\n x: point.x !== 0 ? -point.x : 0,\n y: point.y !== 0 ? -point.y : 0\n});\nconst patch = (line, value, otherValue = 0) => {\n if (line === 'x') {\n return {\n x: value,\n y: otherValue\n };\n }\n return {\n x: otherValue,\n y: value\n };\n};\nconst distance = (point1, point2) => Math.sqrt((point2.x - point1.x) ** 2 + (point2.y - point1.y) ** 2);\nconst closest$1 = (target, points) => Math.min(...points.map(point => distance(target, point)));\nconst apply = fn => point => ({\n x: fn(point.x),\n y: fn(point.y)\n});\n\nvar executeClip = (frame, subject) => {\n const result = getRect({\n top: Math.max(subject.top, frame.top),\n right: Math.min(subject.right, frame.right),\n bottom: Math.min(subject.bottom, frame.bottom),\n left: Math.max(subject.left, frame.left)\n });\n if (result.width <= 0 || result.height <= 0) {\n return null;\n }\n return result;\n};\n\nconst offsetByPosition = (spacing, point) => ({\n top: spacing.top + point.y,\n left: spacing.left + point.x,\n bottom: spacing.bottom + point.y,\n right: spacing.right + point.x\n});\nconst getCorners = spacing => [{\n x: spacing.left,\n y: spacing.top\n}, {\n x: spacing.right,\n y: spacing.top\n}, {\n x: spacing.left,\n y: spacing.bottom\n}, {\n x: spacing.right,\n y: spacing.bottom\n}];\nconst noSpacing = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n};\n\nconst scroll$1 = (target, frame) => {\n if (!frame) {\n return target;\n }\n return offsetByPosition(target, frame.scroll.diff.displacement);\n};\nconst increase = (target, axis, withPlaceholder) => {\n if (withPlaceholder && withPlaceholder.increasedBy) {\n return {\n ...target,\n [axis.end]: target[axis.end] + withPlaceholder.increasedBy[axis.line]\n };\n }\n return target;\n};\nconst clip = (target, frame) => {\n if (frame && frame.shouldClipSubject) {\n return executeClip(frame.pageMarginBox, target);\n }\n return getRect(target);\n};\nvar getSubject = ({\n page,\n withPlaceholder,\n axis,\n frame\n}) => {\n const scrolled = scroll$1(page.marginBox, frame);\n const increased = increase(scrolled, axis, withPlaceholder);\n const clipped = clip(increased, frame);\n return {\n page,\n withPlaceholder,\n active: clipped\n };\n};\n\nvar scrollDroppable = (droppable, newScroll) => {\n !droppable.frame ? process.env.NODE_ENV !== \"production\" ? invariant() : invariant() : void 0;\n const scrollable = droppable.frame;\n const scrollDiff = subtract(newScroll, scrollable.scroll.initial);\n const scrollDisplacement = negate(scrollDiff);\n const frame = {\n ...scrollable,\n scroll: {\n initial: scrollable.scroll.initial,\n current: newScroll,\n diff: {\n value: scrollDiff,\n displacement: scrollDisplacement\n },\n max: scrollable.scroll.max\n }\n };\n const subject = getSubject({\n page: droppable.subject.page,\n withPlaceholder: droppable.subject.withPlaceholder,\n axis: droppable.axis,\n frame\n });\n const result = {\n ...droppable,\n frame,\n subject\n };\n return result;\n};\n\nfunction memoizeOne(resultFn, isEqual = areInputsEqual) {\n let cache = null;\n function memoized(...newArgs) {\n if (cache && cache.lastThis === this && isEqual(newArgs, cache.lastArgs)) {\n return cache.lastResult;\n }\n const lastResult = resultFn.apply(this, newArgs);\n cache = {\n lastResult,\n lastArgs: newArgs,\n lastThis: this\n };\n return lastResult;\n }\n memoized.clear = function clear() {\n cache = null;\n };\n return memoized;\n}\n\nconst toDroppableMap = memoizeOne(droppables => droppables.reduce((previous, current) => {\n previous[current.descriptor.id] = current;\n return previous;\n}, {}));\nconst toDraggableMap = memoizeOne(draggables => draggables.reduce((previous, current) => {\n previous[current.descriptor.id] = current;\n return previous;\n}, {}));\nconst toDroppableList = memoizeOne(droppables => Object.values(droppables));\nconst toDraggableList = memoizeOne(draggables => Object.values(draggables));\n\nvar getDraggablesInsideDroppable = memoizeOne((droppableId, draggables) => {\n const result = toDraggableList(draggables).filter(draggable => droppableId === draggable.descriptor.droppableId).sort((a, b) => a.descriptor.index - b.descriptor.index);\n return result;\n});\n\nfunction tryGetDestination(impact) {\n if (impact.at && impact.at.type === 'REORDER') {\n return impact.at.destination;\n }\n return null;\n}\nfunction tryGetCombine(impact) {\n if (impact.at && impact.at.type === 'COMBINE') {\n return impact.at.combine;\n }\n return null;\n}\n\nvar removeDraggableFromList = memoizeOne((remove, list) => list.filter(item => item.descriptor.id !== remove.descriptor.id));\n\nvar moveToNextCombine = ({\n isMovingForward,\n draggable,\n destination,\n insideDestination,\n previousImpact\n}) => {\n if (!destination.isCombineEnabled) {\n return null;\n }\n const location = tryGetDestination(previousImpact);\n if (!location) {\n return null;\n }\n function getImpact(target) {\n const at = {\n type: 'COMBINE',\n combine: {\n draggableId: target,\n droppableId: destination.descriptor.id\n }\n };\n return {\n ...previousImpact,\n at\n };\n }\n const all = previousImpact.displaced.all;\n const closestId = all.length ? all[0] : null;\n if (isMovingForward) {\n return closestId ? getImpact(closestId) : null;\n }\n const withoutDraggable = removeDraggableFromList(draggable, insideDestination);\n if (!closestId) {\n if (!withoutDraggable.length) {\n return null;\n }\n const last = withoutDraggable[withoutDraggable.length - 1];\n return getImpact(last.descriptor.id);\n }\n const indexOfClosest = withoutDraggable.findIndex(d => d.descriptor.id === closestId);\n !(indexOfClosest !== -1) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Could not find displaced item in set') : invariant() : void 0;\n const proposedIndex = indexOfClosest - 1;\n if (proposedIndex < 0) {\n return null;\n }\n const before = withoutDraggable[proposedIndex];\n return getImpact(before.descriptor.id);\n};\n\nvar isHomeOf = (draggable, destination) => draggable.descriptor.droppableId === destination.descriptor.id;\n\nconst noDisplacedBy = {\n point: origin,\n value: 0\n};\nconst emptyGroups = {\n invisible: {},\n visible: {},\n all: []\n};\nconst noImpact = {\n displaced: emptyGroups,\n displacedBy: noDisplacedBy,\n at: null\n};\n\nvar isWithin = (lowerBound, upperBound) => value => lowerBound <= value && value <= upperBound;\n\nvar isPartiallyVisibleThroughFrame = frame => {\n const isWithinVertical = isWithin(frame.top, frame.bottom);\n const isWithinHorizontal = isWithin(frame.left, frame.right);\n return subject => {\n const isContained = isWithinVertical(subject.top) && isWithinVertical(subject.bottom) && isWithinHorizontal(subject.left) && isWithinHorizontal(subject.right);\n if (isContained) {\n return true;\n }\n const isPartiallyVisibleVertically = isWithinVertical(subject.top) || isWithinVertical(subject.bottom);\n const isPartiallyVisibleHorizontally = isWithinHorizontal(subject.left) || isWithinHorizontal(subject.right);\n const isPartiallyContained = isPartiallyVisibleVertically && isPartiallyVisibleHorizontally;\n if (isPartiallyContained) {\n return true;\n }\n const isBiggerVertically = subject.top < frame.top && subject.bottom > frame.bottom;\n const isBiggerHorizontally = subject.left < frame.left && subject.right > frame.right;\n const isTargetBiggerThanFrame = isBiggerVertically && isBiggerHorizontally;\n if (isTargetBiggerThanFrame) {\n return true;\n }\n const isTargetBiggerOnOneAxis = isBiggerVertically && isPartiallyVisibleHorizontally || isBiggerHorizontally && isPartiallyVisibleVertically;\n return isTargetBiggerOnOneAxis;\n };\n};\n\nvar isTotallyVisibleThroughFrame = frame => {\n const isWithinVertical = isWithin(frame.top, frame.bottom);\n const isWithinHorizontal = isWithin(frame.left, frame.right);\n return subject => {\n const isContained = isWithinVertical(subject.top) && isWithinVertical(subject.bottom) && isWithinHorizontal(subject.left) && isWithinHorizontal(subject.right);\n return isContained;\n };\n};\n\nconst vertical = {\n direction: 'vertical',\n line: 'y',\n crossAxisLine: 'x',\n start: 'top',\n end: 'bottom',\n size: 'height',\n crossAxisStart: 'left',\n crossAxisEnd: 'right',\n crossAxisSize: 'width'\n};\nconst horizontal = {\n direction: 'horizontal',\n line: 'x',\n crossAxisLine: 'y',\n start: 'left',\n end: 'right',\n size: 'width',\n crossAxisStart: 'top',\n crossAxisEnd: 'bottom',\n crossAxisSize: 'height'\n};\n\nvar isTotallyVisibleThroughFrameOnAxis = axis => frame => {\n const isWithinVertical = isWithin(frame.top, frame.bottom);\n const isWithinHorizontal = isWithin(frame.left, frame.right);\n return subject => {\n if (axis === vertical) {\n return isWithinVertical(subject.top) && isWithinVertical(subject.bottom);\n }\n return isWithinHorizontal(subject.left) && isWithinHorizontal(subject.right);\n };\n};\n\nconst getDroppableDisplaced = (target, destination) => {\n const displacement = destination.frame ? destination.frame.scroll.diff.displacement : origin;\n return offsetByPosition(target, displacement);\n};\nconst isVisibleInDroppable = (target, destination, isVisibleThroughFrameFn) => {\n if (!destination.subject.active) {\n return false;\n }\n return isVisibleThroughFrameFn(destination.subject.active)(target);\n};\nconst isVisibleInViewport = (target, viewport, isVisibleThroughFrameFn) => isVisibleThroughFrameFn(viewport)(target);\nconst isVisible$1 = ({\n target: toBeDisplaced,\n destination,\n viewport,\n withDroppableDisplacement,\n isVisibleThroughFrameFn\n}) => {\n const displacedTarget = withDroppableDisplacement ? getDroppableDisplaced(toBeDisplaced, destination) : toBeDisplaced;\n return isVisibleInDroppable(displacedTarget, destination, isVisibleThroughFrameFn) && isVisibleInViewport(displacedTarget, viewport, isVisibleThroughFrameFn);\n};\nconst isPartiallyVisible = args => isVisible$1({\n ...args,\n isVisibleThroughFrameFn: isPartiallyVisibleThroughFrame\n});\nconst isTotallyVisible = args => isVisible$1({\n ...args,\n isVisibleThroughFrameFn: isTotallyVisibleThroughFrame\n});\nconst isTotallyVisibleOnAxis = args => isVisible$1({\n ...args,\n isVisibleThroughFrameFn: isTotallyVisibleThroughFrameOnAxis(args.destination.axis)\n});\n\nconst getShouldAnimate = (id, last, forceShouldAnimate) => {\n if (typeof forceShouldAnimate === 'boolean') {\n return forceShouldAnimate;\n }\n if (!last) {\n return true;\n }\n const {\n invisible,\n visible\n } = last;\n if (invisible[id]) {\n return false;\n }\n const previous = visible[id];\n return previous ? previous.shouldAnimate : true;\n};\nfunction getTarget(draggable, displacedBy) {\n const marginBox = draggable.page.marginBox;\n const expandBy = {\n top: displacedBy.point.y,\n right: 0,\n bottom: 0,\n left: displacedBy.point.x\n };\n return getRect(expand(marginBox, expandBy));\n}\nfunction getDisplacementGroups({\n afterDragging,\n destination,\n displacedBy,\n viewport,\n forceShouldAnimate,\n last\n}) {\n return afterDragging.reduce(function process(groups, draggable) {\n const target = getTarget(draggable, displacedBy);\n const id = draggable.descriptor.id;\n groups.all.push(id);\n const isVisible = isPartiallyVisible({\n target,\n destination,\n viewport,\n withDroppableDisplacement: true\n });\n if (!isVisible) {\n groups.invisible[draggable.descriptor.id] = true;\n return groups;\n }\n const shouldAnimate = getShouldAnimate(id, last, forceShouldAnimate);\n const displacement = {\n draggableId: id,\n shouldAnimate\n };\n groups.visible[id] = displacement;\n return groups;\n }, {\n all: [],\n visible: {},\n invisible: {}\n });\n}\n\nfunction getIndexOfLastItem(draggables, options) {\n if (!draggables.length) {\n return 0;\n }\n const indexOfLastItem = draggables[draggables.length - 1].descriptor.index;\n return options.inHomeList ? indexOfLastItem : indexOfLastItem + 1;\n}\nfunction goAtEnd({\n insideDestination,\n inHomeList,\n displacedBy,\n destination\n}) {\n const newIndex = getIndexOfLastItem(insideDestination, {\n inHomeList\n });\n return {\n displaced: emptyGroups,\n displacedBy,\n at: {\n type: 'REORDER',\n destination: {\n droppableId: destination.descriptor.id,\n index: newIndex\n }\n }\n };\n}\nfunction calculateReorderImpact({\n draggable,\n insideDestination,\n destination,\n viewport,\n displacedBy,\n last,\n index,\n forceShouldAnimate\n}) {\n const inHomeList = isHomeOf(draggable, destination);\n if (index == null) {\n return goAtEnd({\n insideDestination,\n inHomeList,\n displacedBy,\n destination\n });\n }\n const match = insideDestination.find(item => item.descriptor.index === index);\n if (!match) {\n return goAtEnd({\n insideDestination,\n inHomeList,\n displacedBy,\n destination\n });\n }\n const withoutDragging = removeDraggableFromList(draggable, insideDestination);\n const sliceFrom = insideDestination.indexOf(match);\n const impacted = withoutDragging.slice(sliceFrom);\n const displaced = getDisplacementGroups({\n afterDragging: impacted,\n destination,\n displacedBy,\n last,\n viewport: viewport.frame,\n forceShouldAnimate\n });\n return {\n displaced,\n displacedBy,\n at: {\n type: 'REORDER',\n destination: {\n droppableId: destination.descriptor.id,\n index\n }\n }\n };\n}\n\nfunction didStartAfterCritical(draggableId, afterCritical) {\n return Boolean(afterCritical.effected[draggableId]);\n}\n\nvar fromCombine = ({\n isMovingForward,\n destination,\n draggables,\n combine,\n afterCritical\n}) => {\n if (!destination.isCombineEnabled) {\n return null;\n }\n const combineId = combine.draggableId;\n const combineWith = draggables[combineId];\n const combineWithIndex = combineWith.descriptor.index;\n const didCombineWithStartAfterCritical = didStartAfterCritical(combineId, afterCritical);\n if (didCombineWithStartAfterCritical) {\n if (isMovingForward) {\n return combineWithIndex;\n }\n return combineWithIndex - 1;\n }\n if (isMovingForward) {\n return combineWithIndex + 1;\n }\n return combineWithIndex;\n};\n\nvar fromReorder = ({\n isMovingForward,\n isInHomeList,\n insideDestination,\n location\n}) => {\n if (!insideDestination.length) {\n return null;\n }\n const currentIndex = location.index;\n const proposedIndex = isMovingForward ? currentIndex + 1 : currentIndex - 1;\n const firstIndex = insideDestination[0].descriptor.index;\n const lastIndex = insideDestination[insideDestination.length - 1].descriptor.index;\n const upperBound = isInHomeList ? lastIndex : lastIndex + 1;\n if (proposedIndex < firstIndex) {\n return null;\n }\n if (proposedIndex > upperBound) {\n return null;\n }\n return proposedIndex;\n};\n\nvar moveToNextIndex = ({\n isMovingForward,\n isInHomeList,\n draggable,\n draggables,\n destination,\n insideDestination,\n previousImpact,\n viewport,\n afterCritical\n}) => {\n const wasAt = previousImpact.at;\n !wasAt ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot move in direction without previous impact location') : invariant() : void 0;\n if (wasAt.type === 'REORDER') {\n const newIndex = fromReorder({\n isMovingForward,\n isInHomeList,\n location: wasAt.destination,\n insideDestination\n });\n if (newIndex == null) {\n return null;\n }\n return calculateReorderImpact({\n draggable,\n insideDestination,\n destination,\n viewport,\n last: previousImpact.displaced,\n displacedBy: previousImpact.displacedBy,\n index: newIndex\n });\n }\n const newIndex = fromCombine({\n isMovingForward,\n destination,\n displaced: previousImpact.displaced,\n draggables,\n combine: wasAt.combine,\n afterCritical\n });\n if (newIndex == null) {\n return null;\n }\n return calculateReorderImpact({\n draggable,\n insideDestination,\n destination,\n viewport,\n last: previousImpact.displaced,\n displacedBy: previousImpact.displacedBy,\n index: newIndex\n });\n};\n\nvar getCombinedItemDisplacement = ({\n displaced,\n afterCritical,\n combineWith,\n displacedBy\n}) => {\n const isDisplaced = Boolean(displaced.visible[combineWith] || displaced.invisible[combineWith]);\n if (didStartAfterCritical(combineWith, afterCritical)) {\n return isDisplaced ? origin : negate(displacedBy.point);\n }\n return isDisplaced ? displacedBy.point : origin;\n};\n\nvar whenCombining = ({\n afterCritical,\n impact,\n draggables\n}) => {\n const combine = tryGetCombine(impact);\n !combine ? process.env.NODE_ENV !== \"production\" ? invariant() : invariant() : void 0;\n const combineWith = combine.draggableId;\n const center = draggables[combineWith].page.borderBox.center;\n const displaceBy = getCombinedItemDisplacement({\n displaced: impact.displaced,\n afterCritical,\n combineWith,\n displacedBy: impact.displacedBy\n });\n return add(center, displaceBy);\n};\n\nconst distanceFromStartToBorderBoxCenter = (axis, box) => box.margin[axis.start] + box.borderBox[axis.size] / 2;\nconst distanceFromEndToBorderBoxCenter = (axis, box) => box.margin[axis.end] + box.borderBox[axis.size] / 2;\nconst getCrossAxisBorderBoxCenter = (axis, target, isMoving) => target[axis.crossAxisStart] + isMoving.margin[axis.crossAxisStart] + isMoving.borderBox[axis.crossAxisSize] / 2;\nconst goAfter = ({\n axis,\n moveRelativeTo,\n isMoving\n}) => patch(axis.line, moveRelativeTo.marginBox[axis.end] + distanceFromStartToBorderBoxCenter(axis, isMoving), getCrossAxisBorderBoxCenter(axis, moveRelativeTo.marginBox, isMoving));\nconst goBefore = ({\n axis,\n moveRelativeTo,\n isMoving\n}) => patch(axis.line, moveRelativeTo.marginBox[axis.start] - distanceFromEndToBorderBoxCenter(axis, isMoving), getCrossAxisBorderBoxCenter(axis, moveRelativeTo.marginBox, isMoving));\nconst goIntoStart = ({\n axis,\n moveInto,\n isMoving\n}) => patch(axis.line, moveInto.contentBox[axis.start] + distanceFromStartToBorderBoxCenter(axis, isMoving), getCrossAxisBorderBoxCenter(axis, moveInto.contentBox, isMoving));\n\nvar whenReordering = ({\n impact,\n draggable,\n draggables,\n droppable,\n afterCritical\n}) => {\n const insideDestination = getDraggablesInsideDroppable(droppable.descriptor.id, draggables);\n const draggablePage = draggable.page;\n const axis = droppable.axis;\n if (!insideDestination.length) {\n return goIntoStart({\n axis,\n moveInto: droppable.page,\n isMoving: draggablePage\n });\n }\n const {\n displaced,\n displacedBy\n } = impact;\n const closestAfter = displaced.all[0];\n if (closestAfter) {\n const closest = draggables[closestAfter];\n if (didStartAfterCritical(closestAfter, afterCritical)) {\n return goBefore({\n axis,\n moveRelativeTo: closest.page,\n isMoving: draggablePage\n });\n }\n const withDisplacement = offset(closest.page, displacedBy.point);\n return goBefore({\n axis,\n moveRelativeTo: withDisplacement,\n isMoving: draggablePage\n });\n }\n const last = insideDestination[insideDestination.length - 1];\n if (last.descriptor.id === draggable.descriptor.id) {\n return draggablePage.borderBox.center;\n }\n if (didStartAfterCritical(last.descriptor.id, afterCritical)) {\n const page = offset(last.page, negate(afterCritical.displacedBy.point));\n return goAfter({\n axis,\n moveRelativeTo: page,\n isMoving: draggablePage\n });\n }\n return goAfter({\n axis,\n moveRelativeTo: last.page,\n isMoving: draggablePage\n });\n};\n\nvar withDroppableDisplacement = (droppable, point) => {\n const frame = droppable.frame;\n if (!frame) {\n return point;\n }\n return add(point, frame.scroll.diff.displacement);\n};\n\nconst getResultWithoutDroppableDisplacement = ({\n impact,\n draggable,\n droppable,\n draggables,\n afterCritical\n}) => {\n const original = draggable.page.borderBox.center;\n const at = impact.at;\n if (!droppable) {\n return original;\n }\n if (!at) {\n return original;\n }\n if (at.type === 'REORDER') {\n return whenReordering({\n impact,\n draggable,\n draggables,\n droppable,\n afterCritical\n });\n }\n return whenCombining({\n impact,\n draggables,\n afterCritical\n });\n};\nvar getPageBorderBoxCenterFromImpact = args => {\n const withoutDisplacement = getResultWithoutDroppableDisplacement(args);\n const droppable = args.droppable;\n const withDisplacement = droppable ? withDroppableDisplacement(droppable, withoutDisplacement) : withoutDisplacement;\n return withDisplacement;\n};\n\nvar scrollViewport = (viewport, newScroll) => {\n const diff = subtract(newScroll, viewport.scroll.initial);\n const displacement = negate(diff);\n const frame = getRect({\n top: newScroll.y,\n bottom: newScroll.y + viewport.frame.height,\n left: newScroll.x,\n right: newScroll.x + viewport.frame.width\n });\n const updated = {\n frame,\n scroll: {\n initial: viewport.scroll.initial,\n max: viewport.scroll.max,\n current: newScroll,\n diff: {\n value: diff,\n displacement\n }\n }\n };\n return updated;\n};\n\nfunction getDraggables$1(ids, draggables) {\n return ids.map(id => draggables[id]);\n}\nfunction tryGetVisible(id, groups) {\n for (let i = 0; i < groups.length; i++) {\n const displacement = groups[i].visible[id];\n if (displacement) {\n return displacement;\n }\n }\n return null;\n}\nvar speculativelyIncrease = ({\n impact,\n viewport,\n destination,\n draggables,\n maxScrollChange\n}) => {\n const scrolledViewport = scrollViewport(viewport, add(viewport.scroll.current, maxScrollChange));\n const scrolledDroppable = destination.frame ? scrollDroppable(destination, add(destination.frame.scroll.current, maxScrollChange)) : destination;\n const last = impact.displaced;\n const withViewportScroll = getDisplacementGroups({\n afterDragging: getDraggables$1(last.all, draggables),\n destination,\n displacedBy: impact.displacedBy,\n viewport: scrolledViewport.frame,\n last,\n forceShouldAnimate: false\n });\n const withDroppableScroll = getDisplacementGroups({\n afterDragging: getDraggables$1(last.all, draggables),\n destination: scrolledDroppable,\n displacedBy: impact.displacedBy,\n viewport: viewport.frame,\n last,\n forceShouldAnimate: false\n });\n const invisible = {};\n const visible = {};\n const groups = [last, withViewportScroll, withDroppableScroll];\n last.all.forEach(id => {\n const displacement = tryGetVisible(id, groups);\n if (displacement) {\n visible[id] = displacement;\n return;\n }\n invisible[id] = true;\n });\n const newImpact = {\n ...impact,\n displaced: {\n all: last.all,\n invisible,\n visible\n }\n };\n return newImpact;\n};\n\nvar withViewportDisplacement = (viewport, point) => add(viewport.scroll.diff.displacement, point);\n\nvar getClientFromPageBorderBoxCenter = ({\n pageBorderBoxCenter,\n draggable,\n viewport\n}) => {\n const withoutPageScrollChange = withViewportDisplacement(viewport, pageBorderBoxCenter);\n const offset = subtract(withoutPageScrollChange, draggable.page.borderBox.center);\n return add(draggable.client.borderBox.center, offset);\n};\n\nvar isTotallyVisibleInNewLocation = ({\n draggable,\n destination,\n newPageBorderBoxCenter,\n viewport,\n withDroppableDisplacement,\n onlyOnMainAxis = false\n}) => {\n const changeNeeded = subtract(newPageBorderBoxCenter, draggable.page.borderBox.center);\n const shifted = offsetByPosition(draggable.page.borderBox, changeNeeded);\n const args = {\n target: shifted,\n destination,\n withDroppableDisplacement,\n viewport\n };\n return onlyOnMainAxis ? isTotallyVisibleOnAxis(args) : isTotallyVisible(args);\n};\n\nvar moveToNextPlace = ({\n isMovingForward,\n draggable,\n destination,\n draggables,\n previousImpact,\n viewport,\n previousPageBorderBoxCenter,\n previousClientSelection,\n afterCritical\n}) => {\n if (!destination.isEnabled) {\n return null;\n }\n const insideDestination = getDraggablesInsideDroppable(destination.descriptor.id, draggables);\n const isInHomeList = isHomeOf(draggable, destination);\n const impact = moveToNextCombine({\n isMovingForward,\n draggable,\n destination,\n insideDestination,\n previousImpact\n }) || moveToNextIndex({\n isMovingForward,\n isInHomeList,\n draggable,\n draggables,\n destination,\n insideDestination,\n previousImpact,\n viewport,\n afterCritical\n });\n if (!impact) {\n return null;\n }\n const pageBorderBoxCenter = getPageBorderBoxCenterFromImpact({\n impact,\n draggable,\n droppable: destination,\n draggables,\n afterCritical\n });\n const isVisibleInNewLocation = isTotallyVisibleInNewLocation({\n draggable,\n destination,\n newPageBorderBoxCenter: pageBorderBoxCenter,\n viewport: viewport.frame,\n withDroppableDisplacement: false,\n onlyOnMainAxis: true\n });\n if (isVisibleInNewLocation) {\n const clientSelection = getClientFromPageBorderBoxCenter({\n pageBorderBoxCenter,\n draggable,\n viewport\n });\n return {\n clientSelection,\n impact,\n scrollJumpRequest: null\n };\n }\n const distance = subtract(pageBorderBoxCenter, previousPageBorderBoxCenter);\n const cautious = speculativelyIncrease({\n impact,\n viewport,\n destination,\n draggables,\n maxScrollChange: distance\n });\n return {\n clientSelection: previousClientSelection,\n impact: cautious,\n scrollJumpRequest: distance\n };\n};\n\nconst getKnownActive = droppable => {\n const rect = droppable.subject.active;\n !rect ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot get clipped area from droppable') : invariant() : void 0;\n return rect;\n};\nvar getBestCrossAxisDroppable = ({\n isMovingForward,\n pageBorderBoxCenter,\n source,\n droppables,\n viewport\n}) => {\n const active = source.subject.active;\n if (!active) {\n return null;\n }\n const axis = source.axis;\n const isBetweenSourceClipped = isWithin(active[axis.start], active[axis.end]);\n const candidates = toDroppableList(droppables).filter(droppable => droppable !== source).filter(droppable => droppable.isEnabled).filter(droppable => Boolean(droppable.subject.active)).filter(droppable => isPartiallyVisibleThroughFrame(viewport.frame)(getKnownActive(droppable))).filter(droppable => {\n const activeOfTarget = getKnownActive(droppable);\n if (isMovingForward) {\n return active[axis.crossAxisEnd] < activeOfTarget[axis.crossAxisEnd];\n }\n return activeOfTarget[axis.crossAxisStart] < active[axis.crossAxisStart];\n }).filter(droppable => {\n const activeOfTarget = getKnownActive(droppable);\n const isBetweenDestinationClipped = isWithin(activeOfTarget[axis.start], activeOfTarget[axis.end]);\n return isBetweenSourceClipped(activeOfTarget[axis.start]) || isBetweenSourceClipped(activeOfTarget[axis.end]) || isBetweenDestinationClipped(active[axis.start]) || isBetweenDestinationClipped(active[axis.end]);\n }).sort((a, b) => {\n const first = getKnownActive(a)[axis.crossAxisStart];\n const second = getKnownActive(b)[axis.crossAxisStart];\n if (isMovingForward) {\n return first - second;\n }\n return second - first;\n }).filter((droppable, index, array) => getKnownActive(droppable)[axis.crossAxisStart] === getKnownActive(array[0])[axis.crossAxisStart]);\n if (!candidates.length) {\n return null;\n }\n if (candidates.length === 1) {\n return candidates[0];\n }\n const contains = candidates.filter(droppable => {\n const isWithinDroppable = isWithin(getKnownActive(droppable)[axis.start], getKnownActive(droppable)[axis.end]);\n return isWithinDroppable(pageBorderBoxCenter[axis.line]);\n });\n if (contains.length === 1) {\n return contains[0];\n }\n if (contains.length > 1) {\n return contains.sort((a, b) => getKnownActive(a)[axis.start] - getKnownActive(b)[axis.start])[0];\n }\n return candidates.sort((a, b) => {\n const first = closest$1(pageBorderBoxCenter, getCorners(getKnownActive(a)));\n const second = closest$1(pageBorderBoxCenter, getCorners(getKnownActive(b)));\n if (first !== second) {\n return first - second;\n }\n return getKnownActive(a)[axis.start] - getKnownActive(b)[axis.start];\n })[0];\n};\n\nconst getCurrentPageBorderBoxCenter = (draggable, afterCritical) => {\n const original = draggable.page.borderBox.center;\n return didStartAfterCritical(draggable.descriptor.id, afterCritical) ? subtract(original, afterCritical.displacedBy.point) : original;\n};\nconst getCurrentPageBorderBox = (draggable, afterCritical) => {\n const original = draggable.page.borderBox;\n return didStartAfterCritical(draggable.descriptor.id, afterCritical) ? offsetByPosition(original, negate(afterCritical.displacedBy.point)) : original;\n};\n\nvar getClosestDraggable = ({\n pageBorderBoxCenter,\n viewport,\n destination,\n insideDestination,\n afterCritical\n}) => {\n const sorted = insideDestination.filter(draggable => isTotallyVisible({\n target: getCurrentPageBorderBox(draggable, afterCritical),\n destination,\n viewport: viewport.frame,\n withDroppableDisplacement: true\n })).sort((a, b) => {\n const distanceToA = distance(pageBorderBoxCenter, withDroppableDisplacement(destination, getCurrentPageBorderBoxCenter(a, afterCritical)));\n const distanceToB = distance(pageBorderBoxCenter, withDroppableDisplacement(destination, getCurrentPageBorderBoxCenter(b, afterCritical)));\n if (distanceToA < distanceToB) {\n return -1;\n }\n if (distanceToB < distanceToA) {\n return 1;\n }\n return a.descriptor.index - b.descriptor.index;\n });\n return sorted[0] || null;\n};\n\nvar getDisplacedBy = memoizeOne(function getDisplacedBy(axis, displaceBy) {\n const displacement = displaceBy[axis.line];\n return {\n value: displacement,\n point: patch(axis.line, displacement)\n };\n});\n\nconst getRequiredGrowthForPlaceholder = (droppable, placeholderSize, draggables) => {\n const axis = droppable.axis;\n if (droppable.descriptor.mode === 'virtual') {\n return patch(axis.line, placeholderSize[axis.line]);\n }\n const availableSpace = droppable.subject.page.contentBox[axis.size];\n const insideDroppable = getDraggablesInsideDroppable(droppable.descriptor.id, draggables);\n const spaceUsed = insideDroppable.reduce((sum, dimension) => sum + dimension.client.marginBox[axis.size], 0);\n const requiredSpace = spaceUsed + placeholderSize[axis.line];\n const needsToGrowBy = requiredSpace - availableSpace;\n if (needsToGrowBy <= 0) {\n return null;\n }\n return patch(axis.line, needsToGrowBy);\n};\nconst withMaxScroll = (frame, max) => ({\n ...frame,\n scroll: {\n ...frame.scroll,\n max\n }\n});\nconst addPlaceholder = (droppable, draggable, draggables) => {\n const frame = droppable.frame;\n !!isHomeOf(draggable, droppable) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Should not add placeholder space to home list') : invariant() : void 0;\n !!droppable.subject.withPlaceholder ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot add placeholder size to a subject when it already has one') : invariant() : void 0;\n const placeholderSize = getDisplacedBy(droppable.axis, draggable.displaceBy).point;\n const requiredGrowth = getRequiredGrowthForPlaceholder(droppable, placeholderSize, draggables);\n const added = {\n placeholderSize,\n increasedBy: requiredGrowth,\n oldFrameMaxScroll: droppable.frame ? droppable.frame.scroll.max : null\n };\n if (!frame) {\n const subject = getSubject({\n page: droppable.subject.page,\n withPlaceholder: added,\n axis: droppable.axis,\n frame: droppable.frame\n });\n return {\n ...droppable,\n subject\n };\n }\n const maxScroll = requiredGrowth ? add(frame.scroll.max, requiredGrowth) : frame.scroll.max;\n const newFrame = withMaxScroll(frame, maxScroll);\n const subject = getSubject({\n page: droppable.subject.page,\n withPlaceholder: added,\n axis: droppable.axis,\n frame: newFrame\n });\n return {\n ...droppable,\n subject,\n frame: newFrame\n };\n};\nconst removePlaceholder = droppable => {\n const added = droppable.subject.withPlaceholder;\n !added ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot remove placeholder form subject when there was none') : invariant() : void 0;\n const frame = droppable.frame;\n if (!frame) {\n const subject = getSubject({\n page: droppable.subject.page,\n axis: droppable.axis,\n frame: null,\n withPlaceholder: null\n });\n return {\n ...droppable,\n subject\n };\n }\n const oldMaxScroll = added.oldFrameMaxScroll;\n !oldMaxScroll ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Expected droppable with frame to have old max frame scroll when removing placeholder') : invariant() : void 0;\n const newFrame = withMaxScroll(frame, oldMaxScroll);\n const subject = getSubject({\n page: droppable.subject.page,\n axis: droppable.axis,\n frame: newFrame,\n withPlaceholder: null\n });\n return {\n ...droppable,\n subject,\n frame: newFrame\n };\n};\n\nvar moveToNewDroppable = ({\n previousPageBorderBoxCenter,\n moveRelativeTo,\n insideDestination,\n draggable,\n draggables,\n destination,\n viewport,\n afterCritical\n}) => {\n if (!moveRelativeTo) {\n if (insideDestination.length) {\n return null;\n }\n const proposed = {\n displaced: emptyGroups,\n displacedBy: noDisplacedBy,\n at: {\n type: 'REORDER',\n destination: {\n droppableId: destination.descriptor.id,\n index: 0\n }\n }\n };\n const proposedPageBorderBoxCenter = getPageBorderBoxCenterFromImpact({\n impact: proposed,\n draggable,\n droppable: destination,\n draggables,\n afterCritical\n });\n const withPlaceholder = isHomeOf(draggable, destination) ? destination : addPlaceholder(destination, draggable, draggables);\n const isVisibleInNewLocation = isTotallyVisibleInNewLocation({\n draggable,\n destination: withPlaceholder,\n newPageBorderBoxCenter: proposedPageBorderBoxCenter,\n viewport: viewport.frame,\n withDroppableDisplacement: false,\n onlyOnMainAxis: true\n });\n return isVisibleInNewLocation ? proposed : null;\n }\n const isGoingBeforeTarget = Boolean(previousPageBorderBoxCenter[destination.axis.line] <= moveRelativeTo.page.borderBox.center[destination.axis.line]);\n const proposedIndex = (() => {\n const relativeTo = moveRelativeTo.descriptor.index;\n if (moveRelativeTo.descriptor.id === draggable.descriptor.id) {\n return relativeTo;\n }\n if (isGoingBeforeTarget) {\n return relativeTo;\n }\n return relativeTo + 1;\n })();\n const displacedBy = getDisplacedBy(destination.axis, draggable.displaceBy);\n return calculateReorderImpact({\n draggable,\n insideDestination,\n destination,\n viewport,\n displacedBy,\n last: emptyGroups,\n index: proposedIndex\n });\n};\n\nvar moveCrossAxis = ({\n isMovingForward,\n previousPageBorderBoxCenter,\n draggable,\n isOver,\n draggables,\n droppables,\n viewport,\n afterCritical\n}) => {\n const destination = getBestCrossAxisDroppable({\n isMovingForward,\n pageBorderBoxCenter: previousPageBorderBoxCenter,\n source: isOver,\n droppables,\n viewport\n });\n if (!destination) {\n return null;\n }\n const insideDestination = getDraggablesInsideDroppable(destination.descriptor.id, draggables);\n const moveRelativeTo = getClosestDraggable({\n pageBorderBoxCenter: previousPageBorderBoxCenter,\n viewport,\n destination,\n insideDestination,\n afterCritical\n });\n const impact = moveToNewDroppable({\n previousPageBorderBoxCenter,\n destination,\n draggable,\n draggables,\n moveRelativeTo,\n insideDestination,\n viewport,\n afterCritical\n });\n if (!impact) {\n return null;\n }\n const pageBorderBoxCenter = getPageBorderBoxCenterFromImpact({\n impact,\n draggable,\n droppable: destination,\n draggables,\n afterCritical\n });\n const clientSelection = getClientFromPageBorderBoxCenter({\n pageBorderBoxCenter,\n draggable,\n viewport\n });\n return {\n clientSelection,\n impact,\n scrollJumpRequest: null\n };\n};\n\nvar whatIsDraggedOver = impact => {\n const at = impact.at;\n if (!at) {\n return null;\n }\n if (at.type === 'REORDER') {\n return at.destination.droppableId;\n }\n return at.combine.droppableId;\n};\n\nconst getDroppableOver$1 = (impact, droppables) => {\n const id = whatIsDraggedOver(impact);\n return id ? droppables[id] : null;\n};\nvar moveInDirection = ({\n state,\n type\n}) => {\n const isActuallyOver = getDroppableOver$1(state.impact, state.dimensions.droppables);\n const isMainAxisMovementAllowed = Boolean(isActuallyOver);\n const home = state.dimensions.droppables[state.critical.droppable.id];\n const isOver = isActuallyOver || home;\n const direction = isOver.axis.direction;\n const isMovingOnMainAxis = direction === 'vertical' && (type === 'MOVE_UP' || type === 'MOVE_DOWN') || direction === 'horizontal' && (type === 'MOVE_LEFT' || type === 'MOVE_RIGHT');\n if (isMovingOnMainAxis && !isMainAxisMovementAllowed) {\n return null;\n }\n const isMovingForward = type === 'MOVE_DOWN' || type === 'MOVE_RIGHT';\n const draggable = state.dimensions.draggables[state.critical.draggable.id];\n const previousPageBorderBoxCenter = state.current.page.borderBoxCenter;\n const {\n draggables,\n droppables\n } = state.dimensions;\n return isMovingOnMainAxis ? moveToNextPlace({\n isMovingForward,\n previousPageBorderBoxCenter,\n draggable,\n destination: isOver,\n draggables,\n viewport: state.viewport,\n previousClientSelection: state.current.client.selection,\n previousImpact: state.impact,\n afterCritical: state.afterCritical\n }) : moveCrossAxis({\n isMovingForward,\n previousPageBorderBoxCenter,\n draggable,\n isOver,\n draggables,\n droppables,\n viewport: state.viewport,\n afterCritical: state.afterCritical\n });\n};\n\nfunction isMovementAllowed(state) {\n return state.phase === 'DRAGGING' || state.phase === 'COLLECTING';\n}\n\nfunction isPositionInFrame(frame) {\n const isWithinVertical = isWithin(frame.top, frame.bottom);\n const isWithinHorizontal = isWithin(frame.left, frame.right);\n return function run(point) {\n return isWithinVertical(point.y) && isWithinHorizontal(point.x);\n };\n}\n\nfunction getHasOverlap(first, second) {\n return first.left < second.right && first.right > second.left && first.top < second.bottom && first.bottom > second.top;\n}\nfunction getFurthestAway({\n pageBorderBox,\n draggable,\n candidates\n}) {\n const startCenter = draggable.page.borderBox.center;\n const sorted = candidates.map(candidate => {\n const axis = candidate.axis;\n const target = patch(candidate.axis.line, pageBorderBox.center[axis.line], candidate.page.borderBox.center[axis.crossAxisLine]);\n return {\n id: candidate.descriptor.id,\n distance: distance(startCenter, target)\n };\n }).sort((a, b) => b.distance - a.distance);\n return sorted[0] ? sorted[0].id : null;\n}\nfunction getDroppableOver({\n pageBorderBox,\n draggable,\n droppables\n}) {\n const candidates = toDroppableList(droppables).filter(item => {\n if (!item.isEnabled) {\n return false;\n }\n const active = item.subject.active;\n if (!active) {\n return false;\n }\n if (!getHasOverlap(pageBorderBox, active)) {\n return false;\n }\n if (isPositionInFrame(active)(pageBorderBox.center)) {\n return true;\n }\n const axis = item.axis;\n const childCenter = active.center[axis.crossAxisLine];\n const crossAxisStart = pageBorderBox[axis.crossAxisStart];\n const crossAxisEnd = pageBorderBox[axis.crossAxisEnd];\n const isContained = isWithin(active[axis.crossAxisStart], active[axis.crossAxisEnd]);\n const isStartContained = isContained(crossAxisStart);\n const isEndContained = isContained(crossAxisEnd);\n if (!isStartContained && !isEndContained) {\n return true;\n }\n if (isStartContained) {\n return crossAxisStart < childCenter;\n }\n return crossAxisEnd > childCenter;\n });\n if (!candidates.length) {\n return null;\n }\n if (candidates.length === 1) {\n return candidates[0].descriptor.id;\n }\n return getFurthestAway({\n pageBorderBox,\n draggable,\n candidates\n });\n}\n\nconst offsetRectByPosition = (rect, point) => getRect(offsetByPosition(rect, point));\n\nvar withDroppableScroll = (droppable, area) => {\n const frame = droppable.frame;\n if (!frame) {\n return area;\n }\n return offsetRectByPosition(area, frame.scroll.diff.value);\n};\n\nfunction getIsDisplaced({\n displaced,\n id\n}) {\n return Boolean(displaced.visible[id] || displaced.invisible[id]);\n}\n\nfunction atIndex({\n draggable,\n closest,\n inHomeList\n}) {\n if (!closest) {\n return null;\n }\n if (!inHomeList) {\n return closest.descriptor.index;\n }\n if (closest.descriptor.index > draggable.descriptor.index) {\n return closest.descriptor.index - 1;\n }\n return closest.descriptor.index;\n}\nvar getReorderImpact = ({\n pageBorderBoxWithDroppableScroll: targetRect,\n draggable,\n destination,\n insideDestination,\n last,\n viewport,\n afterCritical\n}) => {\n const axis = destination.axis;\n const displacedBy = getDisplacedBy(destination.axis, draggable.displaceBy);\n const displacement = displacedBy.value;\n const targetStart = targetRect[axis.start];\n const targetEnd = targetRect[axis.end];\n const withoutDragging = removeDraggableFromList(draggable, insideDestination);\n const closest = withoutDragging.find(child => {\n const id = child.descriptor.id;\n const childCenter = child.page.borderBox.center[axis.line];\n const didStartAfterCritical$1 = didStartAfterCritical(id, afterCritical);\n const isDisplaced = getIsDisplaced({\n displaced: last,\n id\n });\n if (didStartAfterCritical$1) {\n if (isDisplaced) {\n return targetEnd <= childCenter;\n }\n return targetStart < childCenter - displacement;\n }\n if (isDisplaced) {\n return targetEnd <= childCenter + displacement;\n }\n return targetStart < childCenter;\n }) || null;\n const newIndex = atIndex({\n draggable,\n closest,\n inHomeList: isHomeOf(draggable, destination)\n });\n return calculateReorderImpact({\n draggable,\n insideDestination,\n destination,\n viewport,\n last,\n displacedBy,\n index: newIndex\n });\n};\n\nconst combineThresholdDivisor = 4;\nvar getCombineImpact = ({\n draggable,\n pageBorderBoxWithDroppableScroll: targetRect,\n previousImpact,\n destination,\n insideDestination,\n afterCritical\n}) => {\n if (!destination.isCombineEnabled) {\n return null;\n }\n const axis = destination.axis;\n const displacedBy = getDisplacedBy(destination.axis, draggable.displaceBy);\n const displacement = displacedBy.value;\n const targetStart = targetRect[axis.start];\n const targetEnd = targetRect[axis.end];\n const withoutDragging = removeDraggableFromList(draggable, insideDestination);\n const combineWith = withoutDragging.find(child => {\n const id = child.descriptor.id;\n const childRect = child.page.borderBox;\n const childSize = childRect[axis.size];\n const threshold = childSize / combineThresholdDivisor;\n const didStartAfterCritical$1 = didStartAfterCritical(id, afterCritical);\n const isDisplaced = getIsDisplaced({\n displaced: previousImpact.displaced,\n id\n });\n if (didStartAfterCritical$1) {\n if (isDisplaced) {\n return targetEnd > childRect[axis.start] + threshold && targetEnd < childRect[axis.end] - threshold;\n }\n return targetStart > childRect[axis.start] - displacement + threshold && targetStart < childRect[axis.end] - displacement - threshold;\n }\n if (isDisplaced) {\n return targetEnd > childRect[axis.start] + displacement + threshold && targetEnd < childRect[axis.end] + displacement - threshold;\n }\n return targetStart > childRect[axis.start] + threshold && targetStart < childRect[axis.end] - threshold;\n });\n if (!combineWith) {\n return null;\n }\n const impact = {\n displacedBy,\n displaced: previousImpact.displaced,\n at: {\n type: 'COMBINE',\n combine: {\n draggableId: combineWith.descriptor.id,\n droppableId: destination.descriptor.id\n }\n }\n };\n return impact;\n};\n\nvar getDragImpact = ({\n pageOffset,\n draggable,\n draggables,\n droppables,\n previousImpact,\n viewport,\n afterCritical\n}) => {\n const pageBorderBox = offsetRectByPosition(draggable.page.borderBox, pageOffset);\n const destinationId = getDroppableOver({\n pageBorderBox,\n draggable,\n droppables\n });\n if (!destinationId) {\n return noImpact;\n }\n const destination = droppables[destinationId];\n const insideDestination = getDraggablesInsideDroppable(destination.descriptor.id, draggables);\n const pageBorderBoxWithDroppableScroll = withDroppableScroll(destination, pageBorderBox);\n return getCombineImpact({\n pageBorderBoxWithDroppableScroll,\n draggable,\n previousImpact,\n destination,\n insideDestination,\n afterCritical\n }) || getReorderImpact({\n pageBorderBoxWithDroppableScroll,\n draggable,\n destination,\n insideDestination,\n last: previousImpact.displaced,\n viewport,\n afterCritical\n });\n};\n\nvar patchDroppableMap = (droppables, updated) => ({\n ...droppables,\n [updated.descriptor.id]: updated\n});\n\nconst clearUnusedPlaceholder = ({\n previousImpact,\n impact,\n droppables\n}) => {\n const last = whatIsDraggedOver(previousImpact);\n const now = whatIsDraggedOver(impact);\n if (!last) {\n return droppables;\n }\n if (last === now) {\n return droppables;\n }\n const lastDroppable = droppables[last];\n if (!lastDroppable.subject.withPlaceholder) {\n return droppables;\n }\n const updated = removePlaceholder(lastDroppable);\n return patchDroppableMap(droppables, updated);\n};\nvar recomputePlaceholders = ({\n draggable,\n draggables,\n droppables,\n previousImpact,\n impact\n}) => {\n const cleaned = clearUnusedPlaceholder({\n previousImpact,\n impact,\n droppables\n });\n const isOver = whatIsDraggedOver(impact);\n if (!isOver) {\n return cleaned;\n }\n const droppable = droppables[isOver];\n if (isHomeOf(draggable, droppable)) {\n return cleaned;\n }\n if (droppable.subject.withPlaceholder) {\n return cleaned;\n }\n const patched = addPlaceholder(droppable, draggable, draggables);\n return patchDroppableMap(cleaned, patched);\n};\n\nvar update = ({\n state,\n clientSelection: forcedClientSelection,\n dimensions: forcedDimensions,\n viewport: forcedViewport,\n impact: forcedImpact,\n scrollJumpRequest\n}) => {\n const viewport = forcedViewport || state.viewport;\n const dimensions = forcedDimensions || state.dimensions;\n const clientSelection = forcedClientSelection || state.current.client.selection;\n const offset = subtract(clientSelection, state.initial.client.selection);\n const client = {\n offset,\n selection: clientSelection,\n borderBoxCenter: add(state.initial.client.borderBoxCenter, offset)\n };\n const page = {\n selection: add(client.selection, viewport.scroll.current),\n borderBoxCenter: add(client.borderBoxCenter, viewport.scroll.current),\n offset: add(client.offset, viewport.scroll.diff.value)\n };\n const current = {\n client,\n page\n };\n if (state.phase === 'COLLECTING') {\n return {\n ...state,\n dimensions,\n viewport,\n current\n };\n }\n const draggable = dimensions.draggables[state.critical.draggable.id];\n const newImpact = forcedImpact || getDragImpact({\n pageOffset: page.offset,\n draggable,\n draggables: dimensions.draggables,\n droppables: dimensions.droppables,\n previousImpact: state.impact,\n viewport,\n afterCritical: state.afterCritical\n });\n const withUpdatedPlaceholders = recomputePlaceholders({\n draggable,\n impact: newImpact,\n previousImpact: state.impact,\n draggables: dimensions.draggables,\n droppables: dimensions.droppables\n });\n const result = {\n ...state,\n current,\n dimensions: {\n draggables: dimensions.draggables,\n droppables: withUpdatedPlaceholders\n },\n impact: newImpact,\n viewport,\n scrollJumpRequest: scrollJumpRequest || null,\n forceShouldAnimate: scrollJumpRequest ? false : null\n };\n return result;\n};\n\nfunction getDraggables(ids, draggables) {\n return ids.map(id => draggables[id]);\n}\nvar recompute = ({\n impact,\n viewport,\n draggables,\n destination,\n forceShouldAnimate\n}) => {\n const last = impact.displaced;\n const afterDragging = getDraggables(last.all, draggables);\n const displaced = getDisplacementGroups({\n afterDragging,\n destination,\n displacedBy: impact.displacedBy,\n viewport: viewport.frame,\n forceShouldAnimate,\n last\n });\n return {\n ...impact,\n displaced\n };\n};\n\nvar getClientBorderBoxCenter = ({\n impact,\n draggable,\n droppable,\n draggables,\n viewport,\n afterCritical\n}) => {\n const pageBorderBoxCenter = getPageBorderBoxCenterFromImpact({\n impact,\n draggable,\n draggables,\n droppable,\n afterCritical\n });\n return getClientFromPageBorderBoxCenter({\n pageBorderBoxCenter,\n draggable,\n viewport\n });\n};\n\nvar refreshSnap = ({\n state,\n dimensions: forcedDimensions,\n viewport: forcedViewport\n}) => {\n !(state.movementMode === 'SNAP') ? process.env.NODE_ENV !== \"production\" ? invariant() : invariant() : void 0;\n const needsVisibilityCheck = state.impact;\n const viewport = forcedViewport || state.viewport;\n const dimensions = forcedDimensions || state.dimensions;\n const {\n draggables,\n droppables\n } = dimensions;\n const draggable = draggables[state.critical.draggable.id];\n const isOver = whatIsDraggedOver(needsVisibilityCheck);\n !isOver ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Must be over a destination in SNAP movement mode') : invariant() : void 0;\n const destination = droppables[isOver];\n const impact = recompute({\n impact: needsVisibilityCheck,\n viewport,\n destination,\n draggables\n });\n const clientSelection = getClientBorderBoxCenter({\n impact,\n draggable,\n droppable: destination,\n draggables,\n viewport,\n afterCritical: state.afterCritical\n });\n return update({\n impact,\n clientSelection,\n state,\n dimensions,\n viewport\n });\n};\n\nvar getHomeLocation = descriptor => ({\n index: descriptor.index,\n droppableId: descriptor.droppableId\n});\n\nvar getLiftEffect = ({\n draggable,\n home,\n draggables,\n viewport\n}) => {\n const displacedBy = getDisplacedBy(home.axis, draggable.displaceBy);\n const insideHome = getDraggablesInsideDroppable(home.descriptor.id, draggables);\n const rawIndex = insideHome.indexOf(draggable);\n !(rawIndex !== -1) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Expected draggable to be inside home list') : invariant() : void 0;\n const afterDragging = insideHome.slice(rawIndex + 1);\n const effected = afterDragging.reduce((previous, item) => {\n previous[item.descriptor.id] = true;\n return previous;\n }, {});\n const afterCritical = {\n inVirtualList: home.descriptor.mode === 'virtual',\n displacedBy,\n effected\n };\n const displaced = getDisplacementGroups({\n afterDragging,\n destination: home,\n displacedBy,\n last: null,\n viewport: viewport.frame,\n forceShouldAnimate: false\n });\n const impact = {\n displaced,\n displacedBy,\n at: {\n type: 'REORDER',\n destination: getHomeLocation(draggable.descriptor)\n }\n };\n return {\n impact,\n afterCritical\n };\n};\n\nvar patchDimensionMap = (dimensions, updated) => ({\n draggables: dimensions.draggables,\n droppables: patchDroppableMap(dimensions.droppables, updated)\n});\n\nconst start = key => {\n if (process.env.NODE_ENV !== 'production') {\n {\n return;\n }\n }\n};\nconst finish = key => {\n if (process.env.NODE_ENV !== 'production') {\n {\n return;\n }\n }\n};\n\nvar offsetDraggable = ({\n draggable,\n offset: offset$1,\n initialWindowScroll\n}) => {\n const client = offset(draggable.client, offset$1);\n const page = withScroll(client, initialWindowScroll);\n const moved = {\n ...draggable,\n placeholder: {\n ...draggable.placeholder,\n client\n },\n client,\n page\n };\n return moved;\n};\n\nvar getFrame = droppable => {\n const frame = droppable.frame;\n !frame ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Expected Droppable to have a frame') : invariant() : void 0;\n return frame;\n};\n\nvar adjustAdditionsForScrollChanges = ({\n additions,\n updatedDroppables,\n viewport\n}) => {\n const windowScrollChange = viewport.scroll.diff.value;\n return additions.map(draggable => {\n const droppableId = draggable.descriptor.droppableId;\n const modified = updatedDroppables[droppableId];\n const frame = getFrame(modified);\n const droppableScrollChange = frame.scroll.diff.value;\n const totalChange = add(windowScrollChange, droppableScrollChange);\n const moved = offsetDraggable({\n draggable,\n offset: totalChange,\n initialWindowScroll: viewport.scroll.initial\n });\n return moved;\n });\n};\n\nvar publishWhileDraggingInVirtual = ({\n state,\n published\n}) => {\n start();\n const withScrollChange = published.modified.map(update => {\n const existing = state.dimensions.droppables[update.droppableId];\n const scrolled = scrollDroppable(existing, update.scroll);\n return scrolled;\n });\n const droppables = {\n ...state.dimensions.droppables,\n ...toDroppableMap(withScrollChange)\n };\n const updatedAdditions = toDraggableMap(adjustAdditionsForScrollChanges({\n additions: published.additions,\n updatedDroppables: droppables,\n viewport: state.viewport\n }));\n const draggables = {\n ...state.dimensions.draggables,\n ...updatedAdditions\n };\n published.removals.forEach(id => {\n delete draggables[id];\n });\n const dimensions = {\n droppables,\n draggables\n };\n const wasOverId = whatIsDraggedOver(state.impact);\n const wasOver = wasOverId ? dimensions.droppables[wasOverId] : null;\n const draggable = dimensions.draggables[state.critical.draggable.id];\n const home = dimensions.droppables[state.critical.droppable.id];\n const {\n impact: onLiftImpact,\n afterCritical\n } = getLiftEffect({\n draggable,\n home,\n draggables,\n viewport: state.viewport\n });\n const previousImpact = wasOver && wasOver.isCombineEnabled ? state.impact : onLiftImpact;\n const impact = getDragImpact({\n pageOffset: state.current.page.offset,\n draggable: dimensions.draggables[state.critical.draggable.id],\n draggables: dimensions.draggables,\n droppables: dimensions.droppables,\n previousImpact,\n viewport: state.viewport,\n afterCritical\n });\n finish();\n const draggingState = {\n ...state,\n phase: 'DRAGGING',\n impact,\n onLiftImpact,\n dimensions,\n afterCritical,\n forceShouldAnimate: false\n };\n if (state.phase === 'COLLECTING') {\n return draggingState;\n }\n const dropPending = {\n ...draggingState,\n phase: 'DROP_PENDING',\n reason: state.reason,\n isWaiting: false\n };\n return dropPending;\n};\n\nconst isSnapping = state => state.movementMode === 'SNAP';\nconst postDroppableChange = (state, updated, isEnabledChanging) => {\n const dimensions = patchDimensionMap(state.dimensions, updated);\n if (!isSnapping(state) || isEnabledChanging) {\n return update({\n state,\n dimensions\n });\n }\n return refreshSnap({\n state,\n dimensions\n });\n};\nfunction removeScrollJumpRequest(state) {\n if (state.isDragging && state.movementMode === 'SNAP') {\n return {\n ...state,\n scrollJumpRequest: null\n };\n }\n return state;\n}\nconst idle$2 = {\n phase: 'IDLE',\n completed: null,\n shouldFlush: false\n};\nvar reducer = (state = idle$2, action) => {\n if (action.type === 'FLUSH') {\n return {\n ...idle$2,\n shouldFlush: true\n };\n }\n if (action.type === 'INITIAL_PUBLISH') {\n !(state.phase === 'IDLE') ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'INITIAL_PUBLISH must come after a IDLE phase') : invariant() : void 0;\n const {\n critical,\n clientSelection,\n viewport,\n dimensions,\n movementMode\n } = action.payload;\n const draggable = dimensions.draggables[critical.draggable.id];\n const home = dimensions.droppables[critical.droppable.id];\n const client = {\n selection: clientSelection,\n borderBoxCenter: draggable.client.borderBox.center,\n offset: origin\n };\n const initial = {\n client,\n page: {\n selection: add(client.selection, viewport.scroll.initial),\n borderBoxCenter: add(client.selection, viewport.scroll.initial),\n offset: add(client.selection, viewport.scroll.diff.value)\n }\n };\n const isWindowScrollAllowed = toDroppableList(dimensions.droppables).every(item => !item.isFixedOnPage);\n const {\n impact,\n afterCritical\n } = getLiftEffect({\n draggable,\n home,\n draggables: dimensions.draggables,\n viewport\n });\n const result = {\n phase: 'DRAGGING',\n isDragging: true,\n critical,\n movementMode,\n dimensions,\n initial,\n current: initial,\n isWindowScrollAllowed,\n impact,\n afterCritical,\n onLiftImpact: impact,\n viewport,\n scrollJumpRequest: null,\n forceShouldAnimate: null\n };\n return result;\n }\n if (action.type === 'COLLECTION_STARTING') {\n if (state.phase === 'COLLECTING' || state.phase === 'DROP_PENDING') {\n return state;\n }\n !(state.phase === 'DRAGGING') ? process.env.NODE_ENV !== \"production\" ? invariant(false, `Collection cannot start from phase ${state.phase}`) : invariant() : void 0;\n const result = {\n ...state,\n phase: 'COLLECTING'\n };\n return result;\n }\n if (action.type === 'PUBLISH_WHILE_DRAGGING') {\n !(state.phase === 'COLLECTING' || state.phase === 'DROP_PENDING') ? process.env.NODE_ENV !== \"production\" ? invariant(false, `Unexpected ${action.type} received in phase ${state.phase}`) : invariant() : void 0;\n return publishWhileDraggingInVirtual({\n state,\n published: action.payload\n });\n }\n if (action.type === 'MOVE') {\n if (state.phase === 'DROP_PENDING') {\n return state;\n }\n !isMovementAllowed(state) ? process.env.NODE_ENV !== \"production\" ? invariant(false, `${action.type} not permitted in phase ${state.phase}`) : invariant() : void 0;\n const {\n client: clientSelection\n } = action.payload;\n if (isEqual$1(clientSelection, state.current.client.selection)) {\n return state;\n }\n return update({\n state,\n clientSelection,\n impact: isSnapping(state) ? state.impact : null\n });\n }\n if (action.type === 'UPDATE_DROPPABLE_SCROLL') {\n if (state.phase === 'DROP_PENDING') {\n return removeScrollJumpRequest(state);\n }\n if (state.phase === 'COLLECTING') {\n return removeScrollJumpRequest(state);\n }\n !isMovementAllowed(state) ? process.env.NODE_ENV !== \"production\" ? invariant(false, `${action.type} not permitted in phase ${state.phase}`) : invariant() : void 0;\n const {\n id,\n newScroll\n } = action.payload;\n const target = state.dimensions.droppables[id];\n if (!target) {\n return state;\n }\n const scrolled = scrollDroppable(target, newScroll);\n return postDroppableChange(state, scrolled, false);\n }\n if (action.type === 'UPDATE_DROPPABLE_IS_ENABLED') {\n if (state.phase === 'DROP_PENDING') {\n return state;\n }\n !isMovementAllowed(state) ? process.env.NODE_ENV !== \"production\" ? invariant(false, `Attempting to move in an unsupported phase ${state.phase}`) : invariant() : void 0;\n const {\n id,\n isEnabled\n } = action.payload;\n const target = state.dimensions.droppables[id];\n !target ? process.env.NODE_ENV !== \"production\" ? invariant(false, `Cannot find Droppable[id: ${id}] to toggle its enabled state`) : invariant() : void 0;\n !(target.isEnabled !== isEnabled) ? process.env.NODE_ENV !== \"production\" ? invariant(false, `Trying to set droppable isEnabled to ${String(isEnabled)}\n but it is already ${String(target.isEnabled)}`) : invariant() : void 0;\n const updated = {\n ...target,\n isEnabled\n };\n return postDroppableChange(state, updated, true);\n }\n if (action.type === 'UPDATE_DROPPABLE_IS_COMBINE_ENABLED') {\n if (state.phase === 'DROP_PENDING') {\n return state;\n }\n !isMovementAllowed(state) ? process.env.NODE_ENV !== \"production\" ? invariant(false, `Attempting to move in an unsupported phase ${state.phase}`) : invariant() : void 0;\n const {\n id,\n isCombineEnabled\n } = action.payload;\n const target = state.dimensions.droppables[id];\n !target ? process.env.NODE_ENV !== \"production\" ? invariant(false, `Cannot find Droppable[id: ${id}] to toggle its isCombineEnabled state`) : invariant() : void 0;\n !(target.isCombineEnabled !== isCombineEnabled) ? process.env.NODE_ENV !== \"production\" ? invariant(false, `Trying to set droppable isCombineEnabled to ${String(isCombineEnabled)}\n but it is already ${String(target.isCombineEnabled)}`) : invariant() : void 0;\n const updated = {\n ...target,\n isCombineEnabled\n };\n return postDroppableChange(state, updated, true);\n }\n if (action.type === 'MOVE_BY_WINDOW_SCROLL') {\n if (state.phase === 'DROP_PENDING' || state.phase === 'DROP_ANIMATING') {\n return state;\n }\n !isMovementAllowed(state) ? process.env.NODE_ENV !== \"production\" ? invariant(false, `Cannot move by window in phase ${state.phase}`) : invariant() : void 0;\n !state.isWindowScrollAllowed ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Window scrolling is currently not supported for fixed lists') : invariant() : void 0;\n const newScroll = action.payload.newScroll;\n if (isEqual$1(state.viewport.scroll.current, newScroll)) {\n return removeScrollJumpRequest(state);\n }\n const viewport = scrollViewport(state.viewport, newScroll);\n if (isSnapping(state)) {\n return refreshSnap({\n state,\n viewport\n });\n }\n return update({\n state,\n viewport\n });\n }\n if (action.type === 'UPDATE_VIEWPORT_MAX_SCROLL') {\n if (!isMovementAllowed(state)) {\n return state;\n }\n const maxScroll = action.payload.maxScroll;\n if (isEqual$1(maxScroll, state.viewport.scroll.max)) {\n return state;\n }\n const withMaxScroll = {\n ...state.viewport,\n scroll: {\n ...state.viewport.scroll,\n max: maxScroll\n }\n };\n return {\n ...state,\n viewport: withMaxScroll\n };\n }\n if (action.type === 'MOVE_UP' || action.type === 'MOVE_DOWN' || action.type === 'MOVE_LEFT' || action.type === 'MOVE_RIGHT') {\n if (state.phase === 'COLLECTING' || state.phase === 'DROP_PENDING') {\n return state;\n }\n !(state.phase === 'DRAGGING') ? process.env.NODE_ENV !== \"production\" ? invariant(false, `${action.type} received while not in DRAGGING phase`) : invariant() : void 0;\n const result = moveInDirection({\n state,\n type: action.type\n });\n if (!result) {\n return state;\n }\n return update({\n state,\n impact: result.impact,\n clientSelection: result.clientSelection,\n scrollJumpRequest: result.scrollJumpRequest\n });\n }\n if (action.type === 'DROP_PENDING') {\n const reason = action.payload.reason;\n !(state.phase === 'COLLECTING') ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Can only move into the DROP_PENDING phase from the COLLECTING phase') : invariant() : void 0;\n const newState = {\n ...state,\n phase: 'DROP_PENDING',\n isWaiting: true,\n reason\n };\n return newState;\n }\n if (action.type === 'DROP_ANIMATE') {\n const {\n completed,\n dropDuration,\n newHomeClientOffset\n } = action.payload;\n !(state.phase === 'DRAGGING' || state.phase === 'DROP_PENDING') ? process.env.NODE_ENV !== \"production\" ? invariant(false, `Cannot animate drop from phase ${state.phase}`) : invariant() : void 0;\n const result = {\n phase: 'DROP_ANIMATING',\n completed,\n dropDuration,\n newHomeClientOffset,\n dimensions: state.dimensions\n };\n return result;\n }\n if (action.type === 'DROP_COMPLETE') {\n const {\n completed\n } = action.payload;\n return {\n phase: 'IDLE',\n completed,\n shouldFlush: false\n };\n }\n return state;\n};\n\nfunction guard(action, predicate) {\n return action instanceof Object && 'type' in action && action.type === predicate;\n}\nconst beforeInitialCapture = args => ({\n type: 'BEFORE_INITIAL_CAPTURE',\n payload: args\n});\nconst lift$1 = args => ({\n type: 'LIFT',\n payload: args\n});\nconst initialPublish = args => ({\n type: 'INITIAL_PUBLISH',\n payload: args\n});\nconst publishWhileDragging = args => ({\n type: 'PUBLISH_WHILE_DRAGGING',\n payload: args\n});\nconst collectionStarting = () => ({\n type: 'COLLECTION_STARTING',\n payload: null\n});\nconst updateDroppableScroll = args => ({\n type: 'UPDATE_DROPPABLE_SCROLL',\n payload: args\n});\nconst updateDroppableIsEnabled = args => ({\n type: 'UPDATE_DROPPABLE_IS_ENABLED',\n payload: args\n});\nconst updateDroppableIsCombineEnabled = args => ({\n type: 'UPDATE_DROPPABLE_IS_COMBINE_ENABLED',\n payload: args\n});\nconst move = args => ({\n type: 'MOVE',\n payload: args\n});\nconst moveByWindowScroll = args => ({\n type: 'MOVE_BY_WINDOW_SCROLL',\n payload: args\n});\nconst updateViewportMaxScroll = args => ({\n type: 'UPDATE_VIEWPORT_MAX_SCROLL',\n payload: args\n});\nconst moveUp = () => ({\n type: 'MOVE_UP',\n payload: null\n});\nconst moveDown = () => ({\n type: 'MOVE_DOWN',\n payload: null\n});\nconst moveRight = () => ({\n type: 'MOVE_RIGHT',\n payload: null\n});\nconst moveLeft = () => ({\n type: 'MOVE_LEFT',\n payload: null\n});\nconst flush = () => ({\n type: 'FLUSH',\n payload: null\n});\nconst animateDrop = args => ({\n type: 'DROP_ANIMATE',\n payload: args\n});\nconst completeDrop = args => ({\n type: 'DROP_COMPLETE',\n payload: args\n});\nconst drop = args => ({\n type: 'DROP',\n payload: args\n});\nconst dropPending = args => ({\n type: 'DROP_PENDING',\n payload: args\n});\nconst dropAnimationFinished = () => ({\n type: 'DROP_ANIMATION_FINISHED',\n payload: null\n});\n\nfunction checkIndexes(insideDestination) {\n if (insideDestination.length <= 1) {\n return;\n }\n const indexes = insideDestination.map(d => d.descriptor.index);\n const errors = {};\n for (let i = 1; i < indexes.length; i++) {\n const current = indexes[i];\n const previous = indexes[i - 1];\n if (current !== previous + 1) {\n errors[current] = true;\n }\n }\n if (!Object.keys(errors).length) {\n return;\n }\n const formatted = indexes.map(index => {\n const hasError = Boolean(errors[index]);\n return hasError ? `[🔥${index}]` : `${index}`;\n }).join(', ');\n process.env.NODE_ENV !== \"production\" ? warning(`\n Detected non-consecutive <Draggable /> indexes.\n\n (This can cause unexpected bugs)\n\n ${formatted}\n `) : void 0;\n}\nfunction validateDimensions(critical, dimensions) {\n if (process.env.NODE_ENV !== 'production') {\n const insideDestination = getDraggablesInsideDroppable(critical.droppable.id, dimensions.draggables);\n checkIndexes(insideDestination);\n }\n}\n\nvar lift = marshal => ({\n getState,\n dispatch\n}) => next => action => {\n if (!guard(action, 'LIFT')) {\n next(action);\n return;\n }\n const {\n id,\n clientSelection,\n movementMode\n } = action.payload;\n const initial = getState();\n if (initial.phase === 'DROP_ANIMATING') {\n dispatch(completeDrop({\n completed: initial.completed\n }));\n }\n !(getState().phase === 'IDLE') ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Unexpected phase to start a drag') : invariant() : void 0;\n dispatch(flush());\n dispatch(beforeInitialCapture({\n draggableId: id,\n movementMode\n }));\n const scrollOptions = {\n shouldPublishImmediately: movementMode === 'SNAP'\n };\n const request = {\n draggableId: id,\n scrollOptions\n };\n const {\n critical,\n dimensions,\n viewport\n } = marshal.startPublishing(request);\n validateDimensions(critical, dimensions);\n dispatch(initialPublish({\n critical,\n dimensions,\n clientSelection,\n movementMode,\n viewport\n }));\n};\n\nvar style = marshal => () => next => action => {\n if (guard(action, 'INITIAL_PUBLISH')) {\n marshal.dragging();\n }\n if (guard(action, 'DROP_ANIMATE')) {\n marshal.dropping(action.payload.completed.result.reason);\n }\n if (guard(action, 'FLUSH') || guard(action, 'DROP_COMPLETE')) {\n marshal.resting();\n }\n next(action);\n};\n\nconst curves = {\n outOfTheWay: 'cubic-bezier(0.2, 0, 0, 1)',\n drop: 'cubic-bezier(.2,1,.1,1)'\n};\nconst combine = {\n opacity: {\n drop: 0,\n combining: 0.7\n },\n scale: {\n drop: 0.75\n }\n};\nconst timings = {\n outOfTheWay: 0.2,\n minDropTime: 0.33,\n maxDropTime: 0.55\n};\nconst outOfTheWayTiming = `${timings.outOfTheWay}s ${curves.outOfTheWay}`;\nconst transitions = {\n fluid: `opacity ${outOfTheWayTiming}`,\n snap: `transform ${outOfTheWayTiming}, opacity ${outOfTheWayTiming}`,\n drop: duration => {\n const timing = `${duration}s ${curves.drop}`;\n return `transform ${timing}, opacity ${timing}`;\n },\n outOfTheWay: `transform ${outOfTheWayTiming}`,\n placeholder: `height ${outOfTheWayTiming}, width ${outOfTheWayTiming}, margin ${outOfTheWayTiming}`\n};\nconst moveTo = offset => isEqual$1(offset, origin) ? undefined : `translate(${offset.x}px, ${offset.y}px)`;\nconst transforms = {\n moveTo,\n drop: (offset, isCombining) => {\n const translate = moveTo(offset);\n if (!translate) {\n return undefined;\n }\n if (!isCombining) {\n return translate;\n }\n return `${translate} scale(${combine.scale.drop})`;\n }\n};\n\nconst {\n minDropTime,\n maxDropTime\n} = timings;\nconst dropTimeRange = maxDropTime - minDropTime;\nconst maxDropTimeAtDistance = 1500;\nconst cancelDropModifier = 0.6;\nvar getDropDuration = ({\n current,\n destination,\n reason\n}) => {\n const distance$1 = distance(current, destination);\n if (distance$1 <= 0) {\n return minDropTime;\n }\n if (distance$1 >= maxDropTimeAtDistance) {\n return maxDropTime;\n }\n const percentage = distance$1 / maxDropTimeAtDistance;\n const duration = minDropTime + dropTimeRange * percentage;\n const withDuration = reason === 'CANCEL' ? duration * cancelDropModifier : duration;\n return Number(withDuration.toFixed(2));\n};\n\nvar getNewHomeClientOffset = ({\n impact,\n draggable,\n dimensions,\n viewport,\n afterCritical\n}) => {\n const {\n draggables,\n droppables\n } = dimensions;\n const droppableId = whatIsDraggedOver(impact);\n const destination = droppableId ? droppables[droppableId] : null;\n const home = droppables[draggable.descriptor.droppableId];\n const newClientCenter = getClientBorderBoxCenter({\n impact,\n draggable,\n draggables,\n afterCritical,\n droppable: destination || home,\n viewport\n });\n const offset = subtract(newClientCenter, draggable.client.borderBox.center);\n return offset;\n};\n\nvar getDropImpact = ({\n draggables,\n reason,\n lastImpact,\n home,\n viewport,\n onLiftImpact\n}) => {\n if (!lastImpact.at || reason !== 'DROP') {\n const recomputedHomeImpact = recompute({\n draggables,\n impact: onLiftImpact,\n destination: home,\n viewport,\n forceShouldAnimate: true\n });\n return {\n impact: recomputedHomeImpact,\n didDropInsideDroppable: false\n };\n }\n if (lastImpact.at.type === 'REORDER') {\n return {\n impact: lastImpact,\n didDropInsideDroppable: true\n };\n }\n const withoutMovement = {\n ...lastImpact,\n displaced: emptyGroups\n };\n return {\n impact: withoutMovement,\n didDropInsideDroppable: true\n };\n};\n\nconst dropMiddleware = ({\n getState,\n dispatch\n}) => next => action => {\n if (!guard(action, 'DROP')) {\n next(action);\n return;\n }\n const state = getState();\n const reason = action.payload.reason;\n if (state.phase === 'COLLECTING') {\n dispatch(dropPending({\n reason\n }));\n return;\n }\n if (state.phase === 'IDLE') {\n return;\n }\n const isWaitingForDrop = state.phase === 'DROP_PENDING' && state.isWaiting;\n !!isWaitingForDrop ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'A DROP action occurred while DROP_PENDING and still waiting') : invariant() : void 0;\n !(state.phase === 'DRAGGING' || state.phase === 'DROP_PENDING') ? process.env.NODE_ENV !== \"production\" ? invariant(false, `Cannot drop in phase: ${state.phase}`) : invariant() : void 0;\n const critical = state.critical;\n const dimensions = state.dimensions;\n const draggable = dimensions.draggables[state.critical.draggable.id];\n const {\n impact,\n didDropInsideDroppable\n } = getDropImpact({\n reason,\n lastImpact: state.impact,\n afterCritical: state.afterCritical,\n onLiftImpact: state.onLiftImpact,\n home: state.dimensions.droppables[state.critical.droppable.id],\n viewport: state.viewport,\n draggables: state.dimensions.draggables\n });\n const destination = didDropInsideDroppable ? tryGetDestination(impact) : null;\n const combine = didDropInsideDroppable ? tryGetCombine(impact) : null;\n const source = {\n index: critical.draggable.index,\n droppableId: critical.droppable.id\n };\n const result = {\n draggableId: draggable.descriptor.id,\n type: draggable.descriptor.type,\n source,\n reason,\n mode: state.movementMode,\n destination,\n combine\n };\n const newHomeClientOffset = getNewHomeClientOffset({\n impact,\n draggable,\n dimensions,\n viewport: state.viewport,\n afterCritical: state.afterCritical\n });\n const completed = {\n critical: state.critical,\n afterCritical: state.afterCritical,\n result,\n impact\n };\n const isAnimationRequired = !isEqual$1(state.current.client.offset, newHomeClientOffset) || Boolean(result.combine);\n if (!isAnimationRequired) {\n dispatch(completeDrop({\n completed\n }));\n return;\n }\n const dropDuration = getDropDuration({\n current: state.current.client.offset,\n destination: newHomeClientOffset,\n reason\n });\n const args = {\n newHomeClientOffset,\n dropDuration,\n completed\n };\n dispatch(animateDrop(args));\n};\n\nvar getWindowScroll = () => ({\n x: window.pageXOffset,\n y: window.pageYOffset\n});\n\nfunction getWindowScrollBinding(update) {\n return {\n eventName: 'scroll',\n options: {\n passive: true,\n capture: false\n },\n fn: event => {\n if (event.target !== window && event.target !== window.document) {\n return;\n }\n update();\n }\n };\n}\nfunction getScrollListener({\n onWindowScroll\n}) {\n function updateScroll() {\n onWindowScroll(getWindowScroll());\n }\n const scheduled = rafSchd(updateScroll);\n const binding = getWindowScrollBinding(scheduled);\n let unbind = noop$2;\n function isActive() {\n return unbind !== noop$2;\n }\n function start() {\n !!isActive() ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot start scroll listener when already active') : invariant() : void 0;\n unbind = bindEvents(window, [binding]);\n }\n function stop() {\n !isActive() ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot stop scroll listener when not active') : invariant() : void 0;\n scheduled.cancel();\n unbind();\n unbind = noop$2;\n }\n return {\n start,\n stop,\n isActive\n };\n}\n\nconst shouldStop$1 = action => guard(action, 'DROP_COMPLETE') || guard(action, 'DROP_ANIMATE') || guard(action, 'FLUSH');\nconst scrollListener = store => {\n const listener = getScrollListener({\n onWindowScroll: newScroll => {\n store.dispatch(moveByWindowScroll({\n newScroll\n }));\n }\n });\n return next => action => {\n if (!listener.isActive() && guard(action, 'INITIAL_PUBLISH')) {\n listener.start();\n }\n if (listener.isActive() && shouldStop$1(action)) {\n listener.stop();\n }\n next(action);\n };\n};\n\nvar getExpiringAnnounce = announce => {\n let wasCalled = false;\n let isExpired = false;\n const timeoutId = setTimeout(() => {\n isExpired = true;\n });\n const result = message => {\n if (wasCalled) {\n process.env.NODE_ENV !== \"production\" ? warning('Announcement already made. Not making a second announcement') : void 0;\n return;\n }\n if (isExpired) {\n process.env.NODE_ENV !== \"production\" ? warning(`\n Announcements cannot be made asynchronously.\n Default message has already been announced.\n `) : void 0;\n return;\n }\n wasCalled = true;\n announce(message);\n clearTimeout(timeoutId);\n };\n result.wasCalled = () => wasCalled;\n return result;\n};\n\nvar getAsyncMarshal = () => {\n const entries = [];\n const execute = timerId => {\n const index = entries.findIndex(item => item.timerId === timerId);\n !(index !== -1) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Could not find timer') : invariant() : void 0;\n const [entry] = entries.splice(index, 1);\n entry.callback();\n };\n const add = fn => {\n const timerId = setTimeout(() => execute(timerId));\n const entry = {\n timerId,\n callback: fn\n };\n entries.push(entry);\n };\n const flush = () => {\n if (!entries.length) {\n return;\n }\n const shallow = [...entries];\n entries.length = 0;\n shallow.forEach(entry => {\n clearTimeout(entry.timerId);\n entry.callback();\n });\n };\n return {\n add,\n flush\n };\n};\n\nconst areLocationsEqual = (first, second) => {\n if (first == null && second == null) {\n return true;\n }\n if (first == null || second == null) {\n return false;\n }\n return first.droppableId === second.droppableId && first.index === second.index;\n};\nconst isCombineEqual = (first, second) => {\n if (first == null && second == null) {\n return true;\n }\n if (first == null || second == null) {\n return false;\n }\n return first.draggableId === second.draggableId && first.droppableId === second.droppableId;\n};\nconst isCriticalEqual = (first, second) => {\n if (first === second) {\n return true;\n }\n const isDraggableEqual = first.draggable.id === second.draggable.id && first.draggable.droppableId === second.draggable.droppableId && first.draggable.type === second.draggable.type && first.draggable.index === second.draggable.index;\n const isDroppableEqual = first.droppable.id === second.droppable.id && first.droppable.type === second.droppable.type;\n return isDraggableEqual && isDroppableEqual;\n};\n\nconst withTimings = (key, fn) => {\n start();\n fn();\n finish();\n};\nconst getDragStart = (critical, mode) => ({\n draggableId: critical.draggable.id,\n type: critical.droppable.type,\n source: {\n droppableId: critical.droppable.id,\n index: critical.draggable.index\n },\n mode\n});\nfunction execute(responder, data, announce, getDefaultMessage) {\n if (!responder) {\n announce(getDefaultMessage(data));\n return;\n }\n const willExpire = getExpiringAnnounce(announce);\n const provided = {\n announce: willExpire\n };\n responder(data, provided);\n if (!willExpire.wasCalled()) {\n announce(getDefaultMessage(data));\n }\n}\nvar getPublisher = (getResponders, announce) => {\n const asyncMarshal = getAsyncMarshal();\n let dragging = null;\n const beforeCapture = (draggableId, mode) => {\n !!dragging ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot fire onBeforeCapture as a drag start has already been published') : invariant() : void 0;\n withTimings('onBeforeCapture', () => {\n const fn = getResponders().onBeforeCapture;\n if (fn) {\n const before = {\n draggableId,\n mode\n };\n fn(before);\n }\n });\n };\n const beforeStart = (critical, mode) => {\n !!dragging ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot fire onBeforeDragStart as a drag start has already been published') : invariant() : void 0;\n withTimings('onBeforeDragStart', () => {\n const fn = getResponders().onBeforeDragStart;\n if (fn) {\n fn(getDragStart(critical, mode));\n }\n });\n };\n const start = (critical, mode) => {\n !!dragging ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot fire onBeforeDragStart as a drag start has already been published') : invariant() : void 0;\n const data = getDragStart(critical, mode);\n dragging = {\n mode,\n lastCritical: critical,\n lastLocation: data.source,\n lastCombine: null\n };\n asyncMarshal.add(() => {\n withTimings('onDragStart', () => execute(getResponders().onDragStart, data, announce, preset.onDragStart));\n });\n };\n const update = (critical, impact) => {\n const location = tryGetDestination(impact);\n const combine = tryGetCombine(impact);\n !dragging ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot fire onDragMove when onDragStart has not been called') : invariant() : void 0;\n const hasCriticalChanged = !isCriticalEqual(critical, dragging.lastCritical);\n if (hasCriticalChanged) {\n dragging.lastCritical = critical;\n }\n const hasLocationChanged = !areLocationsEqual(dragging.lastLocation, location);\n if (hasLocationChanged) {\n dragging.lastLocation = location;\n }\n const hasGroupingChanged = !isCombineEqual(dragging.lastCombine, combine);\n if (hasGroupingChanged) {\n dragging.lastCombine = combine;\n }\n if (!hasCriticalChanged && !hasLocationChanged && !hasGroupingChanged) {\n return;\n }\n const data = {\n ...getDragStart(critical, dragging.mode),\n combine,\n destination: location\n };\n asyncMarshal.add(() => {\n withTimings('onDragUpdate', () => execute(getResponders().onDragUpdate, data, announce, preset.onDragUpdate));\n });\n };\n const flush = () => {\n !dragging ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Can only flush responders while dragging') : invariant() : void 0;\n asyncMarshal.flush();\n };\n const drop = result => {\n !dragging ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot fire onDragEnd when there is no matching onDragStart') : invariant() : void 0;\n dragging = null;\n withTimings('onDragEnd', () => execute(getResponders().onDragEnd, result, announce, preset.onDragEnd));\n };\n const abort = () => {\n if (!dragging) {\n return;\n }\n const result = {\n ...getDragStart(dragging.lastCritical, dragging.mode),\n combine: null,\n destination: null,\n reason: 'CANCEL'\n };\n drop(result);\n };\n return {\n beforeCapture,\n beforeStart,\n start,\n update,\n flush,\n drop,\n abort\n };\n};\n\nvar responders = (getResponders, announce) => {\n const publisher = getPublisher(getResponders, announce);\n return store => next => action => {\n if (guard(action, 'BEFORE_INITIAL_CAPTURE')) {\n publisher.beforeCapture(action.payload.draggableId, action.payload.movementMode);\n return;\n }\n if (guard(action, 'INITIAL_PUBLISH')) {\n const critical = action.payload.critical;\n publisher.beforeStart(critical, action.payload.movementMode);\n next(action);\n publisher.start(critical, action.payload.movementMode);\n return;\n }\n if (guard(action, 'DROP_COMPLETE')) {\n const result = action.payload.completed.result;\n publisher.flush();\n next(action);\n publisher.drop(result);\n return;\n }\n next(action);\n if (guard(action, 'FLUSH')) {\n publisher.abort();\n return;\n }\n const state = store.getState();\n if (state.phase === 'DRAGGING') {\n publisher.update(state.critical, state.impact);\n }\n };\n};\n\nconst dropAnimationFinishMiddleware = store => next => action => {\n if (!guard(action, 'DROP_ANIMATION_FINISHED')) {\n next(action);\n return;\n }\n const state = store.getState();\n !(state.phase === 'DROP_ANIMATING') ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot finish a drop animating when no drop is occurring') : invariant() : void 0;\n store.dispatch(completeDrop({\n completed: state.completed\n }));\n};\n\nconst dropAnimationFlushOnScrollMiddleware = store => {\n let unbind = null;\n let frameId = null;\n function clear() {\n if (frameId) {\n cancelAnimationFrame(frameId);\n frameId = null;\n }\n if (unbind) {\n unbind();\n unbind = null;\n }\n }\n return next => action => {\n if (guard(action, 'FLUSH') || guard(action, 'DROP_COMPLETE') || guard(action, 'DROP_ANIMATION_FINISHED')) {\n clear();\n }\n next(action);\n if (!guard(action, 'DROP_ANIMATE')) {\n return;\n }\n const binding = {\n eventName: 'scroll',\n options: {\n capture: true,\n passive: false,\n once: true\n },\n fn: function flushDropAnimation() {\n const state = store.getState();\n if (state.phase === 'DROP_ANIMATING') {\n store.dispatch(dropAnimationFinished());\n }\n }\n };\n frameId = requestAnimationFrame(() => {\n frameId = null;\n unbind = bindEvents(window, [binding]);\n });\n };\n};\n\nvar dimensionMarshalStopper = marshal => () => next => action => {\n if (guard(action, 'DROP_COMPLETE') || guard(action, 'FLUSH') || guard(action, 'DROP_ANIMATE')) {\n marshal.stopPublishing();\n }\n next(action);\n};\n\nvar focus = marshal => {\n let isWatching = false;\n return () => next => action => {\n if (guard(action, 'INITIAL_PUBLISH')) {\n isWatching = true;\n marshal.tryRecordFocus(action.payload.critical.draggable.id);\n next(action);\n marshal.tryRestoreFocusRecorded();\n return;\n }\n next(action);\n if (!isWatching) {\n return;\n }\n if (guard(action, 'FLUSH')) {\n isWatching = false;\n marshal.tryRestoreFocusRecorded();\n return;\n }\n if (guard(action, 'DROP_COMPLETE')) {\n isWatching = false;\n const result = action.payload.completed.result;\n if (result.combine) {\n marshal.tryShiftRecord(result.draggableId, result.combine.draggableId);\n }\n marshal.tryRestoreFocusRecorded();\n }\n };\n};\n\nconst shouldStop = action => guard(action, 'DROP_COMPLETE') || guard(action, 'DROP_ANIMATE') || guard(action, 'FLUSH');\nvar autoScroll = autoScroller => store => next => action => {\n if (shouldStop(action)) {\n autoScroller.stop();\n next(action);\n return;\n }\n if (guard(action, 'INITIAL_PUBLISH')) {\n next(action);\n const state = store.getState();\n !(state.phase === 'DRAGGING') ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Expected phase to be DRAGGING after INITIAL_PUBLISH') : invariant() : void 0;\n autoScroller.start(state);\n return;\n }\n next(action);\n autoScroller.scroll(store.getState());\n};\n\nconst pendingDrop = store => next => action => {\n next(action);\n if (!guard(action, 'PUBLISH_WHILE_DRAGGING')) {\n return;\n }\n const postActionState = store.getState();\n if (postActionState.phase !== 'DROP_PENDING') {\n return;\n }\n if (postActionState.isWaiting) {\n return;\n }\n store.dispatch(drop({\n reason: postActionState.reason\n }));\n};\n\nconst composeEnhancers = process.env.NODE_ENV !== 'production' && typeof window !== 'undefined' && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({\n name: '@hello-pangea/dnd'\n}) : compose;\nvar createStore = ({\n dimensionMarshal,\n focusMarshal,\n styleMarshal,\n getResponders,\n announce,\n autoScroller\n}) => createStore$1(reducer, composeEnhancers(applyMiddleware(style(styleMarshal), dimensionMarshalStopper(dimensionMarshal), lift(dimensionMarshal), dropMiddleware, dropAnimationFinishMiddleware, dropAnimationFlushOnScrollMiddleware, pendingDrop, autoScroll(autoScroller), scrollListener, focus(focusMarshal), responders(getResponders, announce))));\n\nconst clean$1 = () => ({\n additions: {},\n removals: {},\n modified: {}\n});\nfunction createPublisher({\n registry,\n callbacks\n}) {\n let staging = clean$1();\n let frameId = null;\n const collect = () => {\n if (frameId) {\n return;\n }\n callbacks.collectionStarting();\n frameId = requestAnimationFrame(() => {\n frameId = null;\n start();\n const {\n additions,\n removals,\n modified\n } = staging;\n const added = Object.keys(additions).map(id => registry.draggable.getById(id).getDimension(origin)).sort((a, b) => a.descriptor.index - b.descriptor.index);\n const updated = Object.keys(modified).map(id => {\n const entry = registry.droppable.getById(id);\n const scroll = entry.callbacks.getScrollWhileDragging();\n return {\n droppableId: id,\n scroll\n };\n });\n const result = {\n additions: added,\n removals: Object.keys(removals),\n modified: updated\n };\n staging = clean$1();\n finish();\n callbacks.publish(result);\n });\n };\n const add = entry => {\n const id = entry.descriptor.id;\n staging.additions[id] = entry;\n staging.modified[entry.descriptor.droppableId] = true;\n if (staging.removals[id]) {\n delete staging.removals[id];\n }\n collect();\n };\n const remove = entry => {\n const descriptor = entry.descriptor;\n staging.removals[descriptor.id] = true;\n staging.modified[descriptor.droppableId] = true;\n if (staging.additions[descriptor.id]) {\n delete staging.additions[descriptor.id];\n }\n collect();\n };\n const stop = () => {\n if (!frameId) {\n return;\n }\n cancelAnimationFrame(frameId);\n frameId = null;\n staging = clean$1();\n };\n return {\n add,\n remove,\n stop\n };\n}\n\nvar getMaxScroll = ({\n scrollHeight,\n scrollWidth,\n height,\n width\n}) => {\n const maxScroll = subtract({\n x: scrollWidth,\n y: scrollHeight\n }, {\n x: width,\n y: height\n });\n const adjustedMaxScroll = {\n x: Math.max(0, maxScroll.x),\n y: Math.max(0, maxScroll.y)\n };\n return adjustedMaxScroll;\n};\n\nvar getDocumentElement = () => {\n const doc = document.documentElement;\n !doc ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot find document.documentElement') : invariant() : void 0;\n return doc;\n};\n\nvar getMaxWindowScroll = () => {\n const doc = getDocumentElement();\n const maxScroll = getMaxScroll({\n scrollHeight: doc.scrollHeight,\n scrollWidth: doc.scrollWidth,\n width: doc.clientWidth,\n height: doc.clientHeight\n });\n return maxScroll;\n};\n\nvar getViewport = () => {\n const scroll = getWindowScroll();\n const maxScroll = getMaxWindowScroll();\n const top = scroll.y;\n const left = scroll.x;\n const doc = getDocumentElement();\n const width = doc.clientWidth;\n const height = doc.clientHeight;\n const right = left + width;\n const bottom = top + height;\n const frame = getRect({\n top,\n left,\n right,\n bottom\n });\n const viewport = {\n frame,\n scroll: {\n initial: scroll,\n current: scroll,\n max: maxScroll,\n diff: {\n value: origin,\n displacement: origin\n }\n }\n };\n return viewport;\n};\n\nvar getInitialPublish = ({\n critical,\n scrollOptions,\n registry\n}) => {\n start();\n const viewport = getViewport();\n const windowScroll = viewport.scroll.current;\n const home = critical.droppable;\n const droppables = registry.droppable.getAllByType(home.type).map(entry => entry.callbacks.getDimensionAndWatchScroll(windowScroll, scrollOptions));\n const draggables = registry.draggable.getAllByType(critical.draggable.type).map(entry => entry.getDimension(windowScroll));\n const dimensions = {\n draggables: toDraggableMap(draggables),\n droppables: toDroppableMap(droppables)\n };\n finish();\n const result = {\n dimensions,\n critical,\n viewport\n };\n return result;\n};\n\nfunction shouldPublishUpdate(registry, dragging, entry) {\n if (entry.descriptor.id === dragging.id) {\n return false;\n }\n if (entry.descriptor.type !== dragging.type) {\n return false;\n }\n const home = registry.droppable.getById(entry.descriptor.droppableId);\n if (home.descriptor.mode !== 'virtual') {\n process.env.NODE_ENV !== \"production\" ? warning(`\n You are attempting to add or remove a Draggable [id: ${entry.descriptor.id}]\n while a drag is occurring. This is only supported for virtual lists.\n\n See https://github.com/hello-pangea/dnd/blob/main/docs/patterns/virtual-lists.md\n `) : void 0;\n return false;\n }\n return true;\n}\nvar createDimensionMarshal = (registry, callbacks) => {\n let collection = null;\n const publisher = createPublisher({\n callbacks: {\n publish: callbacks.publishWhileDragging,\n collectionStarting: callbacks.collectionStarting\n },\n registry\n });\n const updateDroppableIsEnabled = (id, isEnabled) => {\n !registry.droppable.exists(id) ? process.env.NODE_ENV !== \"production\" ? invariant(false, `Cannot update is enabled flag of Droppable ${id} as it is not registered`) : invariant() : void 0;\n if (!collection) {\n return;\n }\n callbacks.updateDroppableIsEnabled({\n id,\n isEnabled\n });\n };\n const updateDroppableIsCombineEnabled = (id, isCombineEnabled) => {\n if (!collection) {\n return;\n }\n !registry.droppable.exists(id) ? process.env.NODE_ENV !== \"production\" ? invariant(false, `Cannot update isCombineEnabled flag of Droppable ${id} as it is not registered`) : invariant() : void 0;\n callbacks.updateDroppableIsCombineEnabled({\n id,\n isCombineEnabled\n });\n };\n const updateDroppableScroll = (id, newScroll) => {\n if (!collection) {\n return;\n }\n !registry.droppable.exists(id) ? process.env.NODE_ENV !== \"production\" ? invariant(false, `Cannot update the scroll on Droppable ${id} as it is not registered`) : invariant() : void 0;\n callbacks.updateDroppableScroll({\n id,\n newScroll\n });\n };\n const scrollDroppable = (id, change) => {\n if (!collection) {\n return;\n }\n registry.droppable.getById(id).callbacks.scroll(change);\n };\n const stopPublishing = () => {\n if (!collection) {\n return;\n }\n publisher.stop();\n const home = collection.critical.droppable;\n registry.droppable.getAllByType(home.type).forEach(entry => entry.callbacks.dragStopped());\n collection.unsubscribe();\n collection = null;\n };\n const subscriber = event => {\n !collection ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Should only be subscribed when a collection is occurring') : invariant() : void 0;\n const dragging = collection.critical.draggable;\n if (event.type === 'ADDITION') {\n if (shouldPublishUpdate(registry, dragging, event.value)) {\n publisher.add(event.value);\n }\n }\n if (event.type === 'REMOVAL') {\n if (shouldPublishUpdate(registry, dragging, event.value)) {\n publisher.remove(event.value);\n }\n }\n };\n const startPublishing = request => {\n !!collection ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot start capturing critical dimensions as there is already a collection') : invariant() : void 0;\n const entry = registry.draggable.getById(request.draggableId);\n const home = registry.droppable.getById(entry.descriptor.droppableId);\n const critical = {\n draggable: entry.descriptor,\n droppable: home.descriptor\n };\n const unsubscribe = registry.subscribe(subscriber);\n collection = {\n critical,\n unsubscribe\n };\n return getInitialPublish({\n critical,\n registry,\n scrollOptions: request.scrollOptions\n });\n };\n const marshal = {\n updateDroppableIsEnabled,\n updateDroppableIsCombineEnabled,\n scrollDroppable,\n updateDroppableScroll,\n startPublishing,\n stopPublishing\n };\n return marshal;\n};\n\nvar canStartDrag = (state, id) => {\n if (state.phase === 'IDLE') {\n return true;\n }\n if (state.phase !== 'DROP_ANIMATING') {\n return false;\n }\n if (state.completed.result.draggableId === id) {\n return false;\n }\n return state.completed.result.reason === 'DROP';\n};\n\nvar scrollWindow = change => {\n window.scrollBy(change.x, change.y);\n};\n\nconst getScrollableDroppables = memoizeOne(droppables => toDroppableList(droppables).filter(droppable => {\n if (!droppable.isEnabled) {\n return false;\n }\n if (!droppable.frame) {\n return false;\n }\n return true;\n}));\nconst getScrollableDroppableOver = (target, droppables) => {\n const maybe = getScrollableDroppables(droppables).find(droppable => {\n !droppable.frame ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Invalid result') : invariant() : void 0;\n return isPositionInFrame(droppable.frame.pageMarginBox)(target);\n }) || null;\n return maybe;\n};\nvar getBestScrollableDroppable = ({\n center,\n destination,\n droppables\n}) => {\n if (destination) {\n const dimension = droppables[destination];\n if (!dimension.frame) {\n return null;\n }\n return dimension;\n }\n const dimension = getScrollableDroppableOver(center, droppables);\n return dimension;\n};\n\nconst defaultAutoScrollerOptions = {\n startFromPercentage: 0.25,\n maxScrollAtPercentage: 0.05,\n maxPixelScroll: 28,\n ease: percentage => percentage ** 2,\n durationDampening: {\n stopDampeningAt: 1200,\n accelerateAt: 360\n },\n disabled: false\n};\n\nvar getDistanceThresholds = (container, axis, getAutoScrollerOptions = () => defaultAutoScrollerOptions) => {\n const autoScrollerOptions = getAutoScrollerOptions();\n const startScrollingFrom = container[axis.size] * autoScrollerOptions.startFromPercentage;\n const maxScrollValueAt = container[axis.size] * autoScrollerOptions.maxScrollAtPercentage;\n const thresholds = {\n startScrollingFrom,\n maxScrollValueAt\n };\n return thresholds;\n};\n\nvar getPercentage = ({\n startOfRange,\n endOfRange,\n current\n}) => {\n const range = endOfRange - startOfRange;\n if (range === 0) {\n process.env.NODE_ENV !== \"production\" ? warning(`\n Detected distance range of 0 in the fluid auto scroller\n This is unexpected and would cause a divide by 0 issue.\n Not allowing an auto scroll\n `) : void 0;\n return 0;\n }\n const currentInRange = current - startOfRange;\n const percentage = currentInRange / range;\n return percentage;\n};\n\nvar minScroll = 1;\n\nvar getValueFromDistance = (distanceToEdge, thresholds, getAutoScrollerOptions = () => defaultAutoScrollerOptions) => {\n const autoScrollerOptions = getAutoScrollerOptions();\n if (distanceToEdge > thresholds.startScrollingFrom) {\n return 0;\n }\n if (distanceToEdge <= thresholds.maxScrollValueAt) {\n return autoScrollerOptions.maxPixelScroll;\n }\n if (distanceToEdge === thresholds.startScrollingFrom) {\n return minScroll;\n }\n const percentageFromMaxScrollValueAt = getPercentage({\n startOfRange: thresholds.maxScrollValueAt,\n endOfRange: thresholds.startScrollingFrom,\n current: distanceToEdge\n });\n const percentageFromStartScrollingFrom = 1 - percentageFromMaxScrollValueAt;\n const scroll = autoScrollerOptions.maxPixelScroll * autoScrollerOptions.ease(percentageFromStartScrollingFrom);\n return Math.ceil(scroll);\n};\n\nvar dampenValueByTime = (proposedScroll, dragStartTime, getAutoScrollerOptions) => {\n const autoScrollerOptions = getAutoScrollerOptions();\n const accelerateAt = autoScrollerOptions.durationDampening.accelerateAt;\n const stopAt = autoScrollerOptions.durationDampening.stopDampeningAt;\n const startOfRange = dragStartTime;\n const endOfRange = stopAt;\n const now = Date.now();\n const runTime = now - startOfRange;\n if (runTime >= stopAt) {\n return proposedScroll;\n }\n if (runTime < accelerateAt) {\n return minScroll;\n }\n const betweenAccelerateAtAndStopAtPercentage = getPercentage({\n startOfRange: accelerateAt,\n endOfRange,\n current: runTime\n });\n const scroll = proposedScroll * autoScrollerOptions.ease(betweenAccelerateAtAndStopAtPercentage);\n return Math.ceil(scroll);\n};\n\nvar getValue = ({\n distanceToEdge,\n thresholds,\n dragStartTime,\n shouldUseTimeDampening,\n getAutoScrollerOptions\n}) => {\n const scroll = getValueFromDistance(distanceToEdge, thresholds, getAutoScrollerOptions);\n if (scroll === 0) {\n return 0;\n }\n if (!shouldUseTimeDampening) {\n return scroll;\n }\n return Math.max(dampenValueByTime(scroll, dragStartTime, getAutoScrollerOptions), minScroll);\n};\n\nvar getScrollOnAxis = ({\n container,\n distanceToEdges,\n dragStartTime,\n axis,\n shouldUseTimeDampening,\n getAutoScrollerOptions\n}) => {\n const thresholds = getDistanceThresholds(container, axis, getAutoScrollerOptions);\n const isCloserToEnd = distanceToEdges[axis.end] < distanceToEdges[axis.start];\n if (isCloserToEnd) {\n return getValue({\n distanceToEdge: distanceToEdges[axis.end],\n thresholds,\n dragStartTime,\n shouldUseTimeDampening,\n getAutoScrollerOptions\n });\n }\n return -1 * getValue({\n distanceToEdge: distanceToEdges[axis.start],\n thresholds,\n dragStartTime,\n shouldUseTimeDampening,\n getAutoScrollerOptions\n });\n};\n\nvar adjustForSizeLimits = ({\n container,\n subject,\n proposedScroll\n}) => {\n const isTooBigVertically = subject.height > container.height;\n const isTooBigHorizontally = subject.width > container.width;\n if (!isTooBigHorizontally && !isTooBigVertically) {\n return proposedScroll;\n }\n if (isTooBigHorizontally && isTooBigVertically) {\n return null;\n }\n return {\n x: isTooBigHorizontally ? 0 : proposedScroll.x,\n y: isTooBigVertically ? 0 : proposedScroll.y\n };\n};\n\nconst clean = apply(value => value === 0 ? 0 : value);\nvar getScroll$1 = ({\n dragStartTime,\n container,\n subject,\n center,\n shouldUseTimeDampening,\n getAutoScrollerOptions\n}) => {\n const distanceToEdges = {\n top: center.y - container.top,\n right: container.right - center.x,\n bottom: container.bottom - center.y,\n left: center.x - container.left\n };\n const y = getScrollOnAxis({\n container,\n distanceToEdges,\n dragStartTime,\n axis: vertical,\n shouldUseTimeDampening,\n getAutoScrollerOptions\n });\n const x = getScrollOnAxis({\n container,\n distanceToEdges,\n dragStartTime,\n axis: horizontal,\n shouldUseTimeDampening,\n getAutoScrollerOptions\n });\n const required = clean({\n x,\n y\n });\n if (isEqual$1(required, origin)) {\n return null;\n }\n const limited = adjustForSizeLimits({\n container,\n subject,\n proposedScroll: required\n });\n if (!limited) {\n return null;\n }\n return isEqual$1(limited, origin) ? null : limited;\n};\n\nconst smallestSigned = apply(value => {\n if (value === 0) {\n return 0;\n }\n return value > 0 ? 1 : -1;\n});\nconst getOverlap = (() => {\n const getRemainder = (target, max) => {\n if (target < 0) {\n return target;\n }\n if (target > max) {\n return target - max;\n }\n return 0;\n };\n return ({\n current,\n max,\n change\n }) => {\n const targetScroll = add(current, change);\n const overlap = {\n x: getRemainder(targetScroll.x, max.x),\n y: getRemainder(targetScroll.y, max.y)\n };\n if (isEqual$1(overlap, origin)) {\n return null;\n }\n return overlap;\n };\n})();\nconst canPartiallyScroll = ({\n max: rawMax,\n current,\n change\n}) => {\n const max = {\n x: Math.max(current.x, rawMax.x),\n y: Math.max(current.y, rawMax.y)\n };\n const smallestChange = smallestSigned(change);\n const overlap = getOverlap({\n max,\n current,\n change: smallestChange\n });\n if (!overlap) {\n return true;\n }\n if (smallestChange.x !== 0 && overlap.x === 0) {\n return true;\n }\n if (smallestChange.y !== 0 && overlap.y === 0) {\n return true;\n }\n return false;\n};\nconst canScrollWindow = (viewport, change) => canPartiallyScroll({\n current: viewport.scroll.current,\n max: viewport.scroll.max,\n change\n});\nconst getWindowOverlap = (viewport, change) => {\n if (!canScrollWindow(viewport, change)) {\n return null;\n }\n const max = viewport.scroll.max;\n const current = viewport.scroll.current;\n return getOverlap({\n current,\n max,\n change\n });\n};\nconst canScrollDroppable = (droppable, change) => {\n const frame = droppable.frame;\n if (!frame) {\n return false;\n }\n return canPartiallyScroll({\n current: frame.scroll.current,\n max: frame.scroll.max,\n change\n });\n};\nconst getDroppableOverlap = (droppable, change) => {\n const frame = droppable.frame;\n if (!frame) {\n return null;\n }\n if (!canScrollDroppable(droppable, change)) {\n return null;\n }\n return getOverlap({\n current: frame.scroll.current,\n max: frame.scroll.max,\n change\n });\n};\n\nvar getWindowScrollChange = ({\n viewport,\n subject,\n center,\n dragStartTime,\n shouldUseTimeDampening,\n getAutoScrollerOptions\n}) => {\n const scroll = getScroll$1({\n dragStartTime,\n container: viewport.frame,\n subject,\n center,\n shouldUseTimeDampening,\n getAutoScrollerOptions\n });\n return scroll && canScrollWindow(viewport, scroll) ? scroll : null;\n};\n\nvar getDroppableScrollChange = ({\n droppable,\n subject,\n center,\n dragStartTime,\n shouldUseTimeDampening,\n getAutoScrollerOptions\n}) => {\n const frame = droppable.frame;\n if (!frame) {\n return null;\n }\n const scroll = getScroll$1({\n dragStartTime,\n container: frame.pageMarginBox,\n subject,\n center,\n shouldUseTimeDampening,\n getAutoScrollerOptions\n });\n return scroll && canScrollDroppable(droppable, scroll) ? scroll : null;\n};\n\nvar scroll = ({\n state,\n dragStartTime,\n shouldUseTimeDampening,\n scrollWindow,\n scrollDroppable,\n getAutoScrollerOptions\n}) => {\n const center = state.current.page.borderBoxCenter;\n const draggable = state.dimensions.draggables[state.critical.draggable.id];\n const subject = draggable.page.marginBox;\n if (state.isWindowScrollAllowed) {\n const viewport = state.viewport;\n const change = getWindowScrollChange({\n dragStartTime,\n viewport,\n subject,\n center,\n shouldUseTimeDampening,\n getAutoScrollerOptions\n });\n if (change) {\n scrollWindow(change);\n return;\n }\n }\n const droppable = getBestScrollableDroppable({\n center,\n destination: whatIsDraggedOver(state.impact),\n droppables: state.dimensions.droppables\n });\n if (!droppable) {\n return;\n }\n const change = getDroppableScrollChange({\n dragStartTime,\n droppable,\n subject,\n center,\n shouldUseTimeDampening,\n getAutoScrollerOptions\n });\n if (change) {\n scrollDroppable(droppable.descriptor.id, change);\n }\n};\n\nvar createFluidScroller = ({\n scrollWindow,\n scrollDroppable,\n getAutoScrollerOptions = () => defaultAutoScrollerOptions\n}) => {\n const scheduleWindowScroll = rafSchd(scrollWindow);\n const scheduleDroppableScroll = rafSchd(scrollDroppable);\n let dragging = null;\n const tryScroll = state => {\n !dragging ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot fluid scroll if not dragging') : invariant() : void 0;\n const {\n shouldUseTimeDampening,\n dragStartTime\n } = dragging;\n scroll({\n state,\n scrollWindow: scheduleWindowScroll,\n scrollDroppable: scheduleDroppableScroll,\n dragStartTime,\n shouldUseTimeDampening,\n getAutoScrollerOptions\n });\n };\n const start$1 = state => {\n start();\n !!dragging ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot start auto scrolling when already started') : invariant() : void 0;\n const dragStartTime = Date.now();\n let wasScrollNeeded = false;\n const fakeScrollCallback = () => {\n wasScrollNeeded = true;\n };\n scroll({\n state,\n dragStartTime: 0,\n shouldUseTimeDampening: false,\n scrollWindow: fakeScrollCallback,\n scrollDroppable: fakeScrollCallback,\n getAutoScrollerOptions\n });\n dragging = {\n dragStartTime,\n shouldUseTimeDampening: wasScrollNeeded\n };\n finish();\n if (wasScrollNeeded) {\n tryScroll(state);\n }\n };\n const stop = () => {\n if (!dragging) {\n return;\n }\n scheduleWindowScroll.cancel();\n scheduleDroppableScroll.cancel();\n dragging = null;\n };\n return {\n start: start$1,\n stop,\n scroll: tryScroll\n };\n};\n\nvar createJumpScroller = ({\n move,\n scrollDroppable,\n scrollWindow\n}) => {\n const moveByOffset = (state, offset) => {\n const client = add(state.current.client.selection, offset);\n move({\n client\n });\n };\n const scrollDroppableAsMuchAsItCan = (droppable, change) => {\n if (!canScrollDroppable(droppable, change)) {\n return change;\n }\n const overlap = getDroppableOverlap(droppable, change);\n if (!overlap) {\n scrollDroppable(droppable.descriptor.id, change);\n return null;\n }\n const whatTheDroppableCanScroll = subtract(change, overlap);\n scrollDroppable(droppable.descriptor.id, whatTheDroppableCanScroll);\n const remainder = subtract(change, whatTheDroppableCanScroll);\n return remainder;\n };\n const scrollWindowAsMuchAsItCan = (isWindowScrollAllowed, viewport, change) => {\n if (!isWindowScrollAllowed) {\n return change;\n }\n if (!canScrollWindow(viewport, change)) {\n return change;\n }\n const overlap = getWindowOverlap(viewport, change);\n if (!overlap) {\n scrollWindow(change);\n return null;\n }\n const whatTheWindowCanScroll = subtract(change, overlap);\n scrollWindow(whatTheWindowCanScroll);\n const remainder = subtract(change, whatTheWindowCanScroll);\n return remainder;\n };\n const jumpScroller = state => {\n const request = state.scrollJumpRequest;\n if (!request) {\n return;\n }\n const destination = whatIsDraggedOver(state.impact);\n !destination ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot perform a jump scroll when there is no destination') : invariant() : void 0;\n const droppableRemainder = scrollDroppableAsMuchAsItCan(state.dimensions.droppables[destination], request);\n if (!droppableRemainder) {\n return;\n }\n const viewport = state.viewport;\n const windowRemainder = scrollWindowAsMuchAsItCan(state.isWindowScrollAllowed, viewport, droppableRemainder);\n if (!windowRemainder) {\n return;\n }\n moveByOffset(state, windowRemainder);\n };\n return jumpScroller;\n};\n\nvar createAutoScroller = ({\n scrollDroppable,\n scrollWindow,\n move,\n getAutoScrollerOptions\n}) => {\n const fluidScroller = createFluidScroller({\n scrollWindow,\n scrollDroppable,\n getAutoScrollerOptions\n });\n const jumpScroll = createJumpScroller({\n move,\n scrollWindow,\n scrollDroppable\n });\n const scroll = state => {\n const autoScrollerOptions = getAutoScrollerOptions();\n if (autoScrollerOptions.disabled || state.phase !== 'DRAGGING') {\n return;\n }\n if (state.movementMode === 'FLUID') {\n fluidScroller.scroll(state);\n return;\n }\n if (!state.scrollJumpRequest) {\n return;\n }\n jumpScroll(state);\n };\n const scroller = {\n scroll,\n start: fluidScroller.start,\n stop: fluidScroller.stop\n };\n return scroller;\n};\n\nconst prefix = 'data-rfd';\nconst dragHandle = (() => {\n const base = `${prefix}-drag-handle`;\n return {\n base,\n draggableId: `${base}-draggable-id`,\n contextId: `${base}-context-id`\n };\n})();\nconst draggable = (() => {\n const base = `${prefix}-draggable`;\n return {\n base,\n contextId: `${base}-context-id`,\n id: `${base}-id`\n };\n})();\nconst droppable = (() => {\n const base = `${prefix}-droppable`;\n return {\n base,\n contextId: `${base}-context-id`,\n id: `${base}-id`\n };\n})();\nconst scrollContainer = {\n contextId: `${prefix}-scroll-container-context-id`\n};\n\nconst makeGetSelector = context => attribute => `[${attribute}=\"${context}\"]`;\nconst getStyles = (rules, property) => rules.map(rule => {\n const value = rule.styles[property];\n if (!value) {\n return '';\n }\n return `${rule.selector} { ${value} }`;\n}).join(' ');\nconst noPointerEvents = 'pointer-events: none;';\nvar getStyles$1 = contextId => {\n const getSelector = makeGetSelector(contextId);\n const dragHandle$1 = (() => {\n const grabCursor = `\n cursor: -webkit-grab;\n cursor: grab;\n `;\n return {\n selector: getSelector(dragHandle.contextId),\n styles: {\n always: `\n -webkit-touch-callout: none;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n touch-action: manipulation;\n `,\n resting: grabCursor,\n dragging: noPointerEvents,\n dropAnimating: grabCursor\n }\n };\n })();\n const draggable$1 = (() => {\n const transition = `\n transition: ${transitions.outOfTheWay};\n `;\n return {\n selector: getSelector(draggable.contextId),\n styles: {\n dragging: transition,\n dropAnimating: transition,\n userCancel: transition\n }\n };\n })();\n const droppable$1 = {\n selector: getSelector(droppable.contextId),\n styles: {\n always: `overflow-anchor: none;`\n }\n };\n const body = {\n selector: 'body',\n styles: {\n dragging: `\n cursor: grabbing;\n cursor: -webkit-grabbing;\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n overflow-anchor: none;\n `\n }\n };\n const rules = [draggable$1, dragHandle$1, droppable$1, body];\n return {\n always: getStyles(rules, 'always'),\n resting: getStyles(rules, 'resting'),\n dragging: getStyles(rules, 'dragging'),\n dropAnimating: getStyles(rules, 'dropAnimating'),\n userCancel: getStyles(rules, 'userCancel')\n };\n};\n\nconst useIsomorphicLayoutEffect = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined' ? useLayoutEffect : useEffect;\n\nconst getHead = () => {\n const head = document.querySelector('head');\n !head ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot find the head to append a style to') : invariant() : void 0;\n return head;\n};\nconst createStyleEl = nonce => {\n const el = document.createElement('style');\n if (nonce) {\n el.setAttribute('nonce', nonce);\n }\n el.type = 'text/css';\n return el;\n};\nfunction useStyleMarshal(contextId, nonce) {\n const styles = useMemo(() => getStyles$1(contextId), [contextId]);\n const alwaysRef = useRef(null);\n const dynamicRef = useRef(null);\n const setDynamicStyle = useCallback(memoizeOne(proposed => {\n const el = dynamicRef.current;\n !el ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot set dynamic style element if it is not set') : invariant() : void 0;\n el.textContent = proposed;\n }), []);\n const setAlwaysStyle = useCallback(proposed => {\n const el = alwaysRef.current;\n !el ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot set dynamic style element if it is not set') : invariant() : void 0;\n el.textContent = proposed;\n }, []);\n useIsomorphicLayoutEffect(() => {\n !(!alwaysRef.current && !dynamicRef.current) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'style elements already mounted') : invariant() : void 0;\n const always = createStyleEl(nonce);\n const dynamic = createStyleEl(nonce);\n alwaysRef.current = always;\n dynamicRef.current = dynamic;\n always.setAttribute(`${prefix}-always`, contextId);\n dynamic.setAttribute(`${prefix}-dynamic`, contextId);\n getHead().appendChild(always);\n getHead().appendChild(dynamic);\n setAlwaysStyle(styles.always);\n setDynamicStyle(styles.resting);\n return () => {\n const remove = ref => {\n const current = ref.current;\n !current ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot unmount ref as it is not set') : invariant() : void 0;\n getHead().removeChild(current);\n ref.current = null;\n };\n remove(alwaysRef);\n remove(dynamicRef);\n };\n }, [nonce, setAlwaysStyle, setDynamicStyle, styles.always, styles.resting, contextId]);\n const dragging = useCallback(() => setDynamicStyle(styles.dragging), [setDynamicStyle, styles.dragging]);\n const dropping = useCallback(reason => {\n if (reason === 'DROP') {\n setDynamicStyle(styles.dropAnimating);\n return;\n }\n setDynamicStyle(styles.userCancel);\n }, [setDynamicStyle, styles.dropAnimating, styles.userCancel]);\n const resting = useCallback(() => {\n if (!dynamicRef.current) {\n return;\n }\n setDynamicStyle(styles.resting);\n }, [setDynamicStyle, styles.resting]);\n const marshal = useMemo(() => ({\n dragging,\n dropping,\n resting\n }), [dragging, dropping, resting]);\n return marshal;\n}\n\nfunction querySelectorAll(parentNode, selector) {\n return Array.from(parentNode.querySelectorAll(selector));\n}\n\nvar getWindowFromEl = el => {\n if (el && el.ownerDocument && el.ownerDocument.defaultView) {\n return el.ownerDocument.defaultView;\n }\n return window;\n};\n\nfunction isHtmlElement(el) {\n return el instanceof getWindowFromEl(el).HTMLElement;\n}\n\nfunction findDragHandle(contextId, draggableId) {\n const selector = `[${dragHandle.contextId}=\"${contextId}\"]`;\n const possible = querySelectorAll(document, selector);\n if (!possible.length) {\n process.env.NODE_ENV !== \"production\" ? warning(`Unable to find any drag handles in the context \"${contextId}\"`) : void 0;\n return null;\n }\n const handle = possible.find(el => {\n return el.getAttribute(dragHandle.draggableId) === draggableId;\n });\n if (!handle) {\n process.env.NODE_ENV !== \"production\" ? warning(`Unable to find drag handle with id \"${draggableId}\" as no handle with a matching id was found`) : void 0;\n return null;\n }\n if (!isHtmlElement(handle)) {\n process.env.NODE_ENV !== \"production\" ? warning('drag handle needs to be a HTMLElement') : void 0;\n return null;\n }\n return handle;\n}\n\nfunction useFocusMarshal(contextId) {\n const entriesRef = useRef({});\n const recordRef = useRef(null);\n const restoreFocusFrameRef = useRef(null);\n const isMountedRef = useRef(false);\n const register = useCallback(function register(id, focus) {\n const entry = {\n id,\n focus\n };\n entriesRef.current[id] = entry;\n return function unregister() {\n const entries = entriesRef.current;\n const current = entries[id];\n if (current !== entry) {\n delete entries[id];\n }\n };\n }, []);\n const tryGiveFocus = useCallback(function tryGiveFocus(tryGiveFocusTo) {\n const handle = findDragHandle(contextId, tryGiveFocusTo);\n if (handle && handle !== document.activeElement) {\n handle.focus();\n }\n }, [contextId]);\n const tryShiftRecord = useCallback(function tryShiftRecord(previous, redirectTo) {\n if (recordRef.current === previous) {\n recordRef.current = redirectTo;\n }\n }, []);\n const tryRestoreFocusRecorded = useCallback(function tryRestoreFocusRecorded() {\n if (restoreFocusFrameRef.current) {\n return;\n }\n if (!isMountedRef.current) {\n return;\n }\n restoreFocusFrameRef.current = requestAnimationFrame(() => {\n restoreFocusFrameRef.current = null;\n const record = recordRef.current;\n if (record) {\n tryGiveFocus(record);\n }\n });\n }, [tryGiveFocus]);\n const tryRecordFocus = useCallback(function tryRecordFocus(id) {\n recordRef.current = null;\n const focused = document.activeElement;\n if (!focused) {\n return;\n }\n if (focused.getAttribute(dragHandle.draggableId) !== id) {\n return;\n }\n recordRef.current = id;\n }, []);\n useIsomorphicLayoutEffect(() => {\n isMountedRef.current = true;\n return function clearFrameOnUnmount() {\n isMountedRef.current = false;\n const frameId = restoreFocusFrameRef.current;\n if (frameId) {\n cancelAnimationFrame(frameId);\n }\n };\n }, []);\n const marshal = useMemo(() => ({\n register,\n tryRecordFocus,\n tryRestoreFocusRecorded,\n tryShiftRecord\n }), [register, tryRecordFocus, tryRestoreFocusRecorded, tryShiftRecord]);\n return marshal;\n}\n\nfunction createRegistry() {\n const entries = {\n draggables: {},\n droppables: {}\n };\n const subscribers = [];\n function subscribe(cb) {\n subscribers.push(cb);\n return function unsubscribe() {\n const index = subscribers.indexOf(cb);\n if (index === -1) {\n return;\n }\n subscribers.splice(index, 1);\n };\n }\n function notify(event) {\n if (subscribers.length) {\n subscribers.forEach(cb => cb(event));\n }\n }\n function findDraggableById(id) {\n return entries.draggables[id] || null;\n }\n function getDraggableById(id) {\n const entry = findDraggableById(id);\n !entry ? process.env.NODE_ENV !== \"production\" ? invariant(false, `Cannot find draggable entry with id [${id}]`) : invariant() : void 0;\n return entry;\n }\n const draggableAPI = {\n register: entry => {\n entries.draggables[entry.descriptor.id] = entry;\n notify({\n type: 'ADDITION',\n value: entry\n });\n },\n update: (entry, last) => {\n const current = entries.draggables[last.descriptor.id];\n if (!current) {\n return;\n }\n if (current.uniqueId !== entry.uniqueId) {\n return;\n }\n delete entries.draggables[last.descriptor.id];\n entries.draggables[entry.descriptor.id] = entry;\n },\n unregister: entry => {\n const draggableId = entry.descriptor.id;\n const current = findDraggableById(draggableId);\n if (!current) {\n return;\n }\n if (entry.uniqueId !== current.uniqueId) {\n return;\n }\n delete entries.draggables[draggableId];\n if (entries.droppables[entry.descriptor.droppableId]) {\n notify({\n type: 'REMOVAL',\n value: entry\n });\n }\n },\n getById: getDraggableById,\n findById: findDraggableById,\n exists: id => Boolean(findDraggableById(id)),\n getAllByType: type => Object.values(entries.draggables).filter(entry => entry.descriptor.type === type)\n };\n function findDroppableById(id) {\n return entries.droppables[id] || null;\n }\n function getDroppableById(id) {\n const entry = findDroppableById(id);\n !entry ? process.env.NODE_ENV !== \"production\" ? invariant(false, `Cannot find droppable entry with id [${id}]`) : invariant() : void 0;\n return entry;\n }\n const droppableAPI = {\n register: entry => {\n entries.droppables[entry.descriptor.id] = entry;\n },\n unregister: entry => {\n const current = findDroppableById(entry.descriptor.id);\n if (!current) {\n return;\n }\n if (entry.uniqueId !== current.uniqueId) {\n return;\n }\n delete entries.droppables[entry.descriptor.id];\n },\n getById: getDroppableById,\n findById: findDroppableById,\n exists: id => Boolean(findDroppableById(id)),\n getAllByType: type => Object.values(entries.droppables).filter(entry => entry.descriptor.type === type)\n };\n function clean() {\n entries.draggables = {};\n entries.droppables = {};\n subscribers.length = 0;\n }\n return {\n draggable: draggableAPI,\n droppable: droppableAPI,\n subscribe,\n clean\n };\n}\n\nfunction useRegistry() {\n const registry = useMemo(createRegistry, []);\n useEffect(() => {\n return function unmount() {\n registry.clean();\n };\n }, [registry]);\n return registry;\n}\n\nvar StoreContext = React.createContext(null);\n\nvar getBodyElement = () => {\n const body = document.body;\n !body ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot find document.body') : invariant() : void 0;\n return body;\n};\n\nconst visuallyHidden = {\n position: 'absolute',\n width: '1px',\n height: '1px',\n margin: '-1px',\n border: '0',\n padding: '0',\n overflow: 'hidden',\n clip: 'rect(0 0 0 0)',\n 'clip-path': 'inset(100%)'\n};\n\nconst getId = contextId => `rfd-announcement-${contextId}`;\nfunction useAnnouncer(contextId) {\n const id = useMemo(() => getId(contextId), [contextId]);\n const ref = useRef(null);\n useEffect(function setup() {\n const el = document.createElement('div');\n ref.current = el;\n el.id = id;\n el.setAttribute('aria-live', 'assertive');\n el.setAttribute('aria-atomic', 'true');\n _extends(el.style, visuallyHidden);\n getBodyElement().appendChild(el);\n return function cleanup() {\n setTimeout(function remove() {\n const body = getBodyElement();\n if (body.contains(el)) {\n body.removeChild(el);\n }\n if (el === ref.current) {\n ref.current = null;\n }\n });\n };\n }, [id]);\n const announce = useCallback(message => {\n const el = ref.current;\n if (el) {\n el.textContent = message;\n return;\n }\n process.env.NODE_ENV !== \"production\" ? warning(`\n A screen reader message was trying to be announced but it was unable to do so.\n This can occur if you unmount your <DragDropContext /> in your onDragEnd.\n Consider calling provided.announce() before the unmount so that the instruction will\n not be lost for users relying on a screen reader.\n\n Message not passed to screen reader:\n\n \"${message}\"\n `) : void 0;\n }, []);\n return announce;\n}\n\nconst defaults = {\n separator: '::'\n};\nfunction useUniqueId(prefix, options = defaults) {\n const id = React.useId();\n return useMemo(() => `${prefix}${options.separator}${id}`, [options.separator, prefix, id]);\n}\n\nfunction getElementId({\n contextId,\n uniqueId\n}) {\n return `rfd-hidden-text-${contextId}-${uniqueId}`;\n}\nfunction useHiddenTextElement({\n contextId,\n text\n}) {\n const uniqueId = useUniqueId('hidden-text', {\n separator: '-'\n });\n const id = useMemo(() => getElementId({\n contextId,\n uniqueId\n }), [uniqueId, contextId]);\n useEffect(function mount() {\n const el = document.createElement('div');\n el.id = id;\n el.textContent = text;\n el.style.display = 'none';\n getBodyElement().appendChild(el);\n return function unmount() {\n const body = getBodyElement();\n if (body.contains(el)) {\n body.removeChild(el);\n }\n };\n }, [id, text]);\n return id;\n}\n\nvar AppContext = React.createContext(null);\n\nvar peerDependencies = {\n\treact: \"^18.0.0 || ^19.0.0\"};\n\nconst semver = /(\\d+)\\.(\\d+)\\.(\\d+)/;\nconst getVersion = value => {\n const result = semver.exec(value);\n !(result != null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, `Unable to parse React version ${value}`) : invariant() : void 0;\n const major = Number(result[1]);\n const minor = Number(result[2]);\n const patch = Number(result[3]);\n return {\n major,\n minor,\n patch,\n raw: value\n };\n};\nconst isSatisfied = (expected, actual) => {\n if (actual.major > expected.major) {\n return true;\n }\n if (actual.major < expected.major) {\n return false;\n }\n if (actual.minor > expected.minor) {\n return true;\n }\n if (actual.minor < expected.minor) {\n return false;\n }\n return actual.patch >= expected.patch;\n};\nvar checkReactVersion = (peerDepValue, actualValue) => {\n const peerDep = getVersion(peerDepValue);\n const actual = getVersion(actualValue);\n if (isSatisfied(peerDep, actual)) {\n return;\n }\n process.env.NODE_ENV !== \"production\" ? warning(`\n React version: [${actual.raw}]\n does not satisfy expected peer dependency version: [${peerDep.raw}]\n\n This can result in run time bugs, and even fatal crashes\n `) : void 0;\n};\n\nconst suffix = `\n We expect a html5 doctype: <!doctype html>\n This is to ensure consistent browser layout and measurement\n\n More information: https://github.com/hello-pangea/dnd/blob/main/docs/guides/doctype.md\n`;\nvar checkDoctype = doc => {\n const doctype = doc.doctype;\n if (!doctype) {\n process.env.NODE_ENV !== \"production\" ? warning(`\n No <!doctype html> found.\n\n ${suffix}\n `) : void 0;\n return;\n }\n if (doctype.name.toLowerCase() !== 'html') {\n process.env.NODE_ENV !== \"production\" ? warning(`\n Unexpected <!doctype> found: (${doctype.name})\n\n ${suffix}\n `) : void 0;\n }\n if (doctype.publicId !== '') {\n process.env.NODE_ENV !== \"production\" ? warning(`\n Unexpected <!doctype> publicId found: (${doctype.publicId})\n A html5 doctype does not have a publicId\n\n ${suffix}\n `) : void 0;\n }\n};\n\nfunction useDev(useHook) {\n if (process.env.NODE_ENV !== 'production') {\n useHook();\n }\n}\n\nfunction useDevSetupWarning(fn, inputs) {\n useDev(() => {\n useEffect(() => {\n try {\n fn();\n } catch (e) {\n error(`\n A setup problem was encountered.\n\n > ${e.message}\n `);\n }\n }, inputs);\n });\n}\n\nfunction useStartupValidation() {\n useDevSetupWarning(() => {\n checkReactVersion(peerDependencies.react, React.version);\n checkDoctype(document);\n }, []);\n}\n\nfunction usePrevious(current) {\n const ref = useRef(current);\n useEffect(() => {\n ref.current = current;\n });\n return ref;\n}\n\nfunction create() {\n let lock = null;\n function isClaimed() {\n return Boolean(lock);\n }\n function isActive(value) {\n return value === lock;\n }\n function claim(abandon) {\n !!lock ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot claim lock as it is already claimed') : invariant() : void 0;\n const newLock = {\n abandon\n };\n lock = newLock;\n return newLock;\n }\n function release() {\n !lock ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot release lock when there is no lock') : invariant() : void 0;\n lock = null;\n }\n function tryAbandon() {\n if (lock) {\n lock.abandon();\n release();\n }\n }\n return {\n isClaimed,\n isActive,\n claim,\n release,\n tryAbandon\n };\n}\n\nfunction isDragging(state) {\n if (state.phase === 'IDLE' || state.phase === 'DROP_ANIMATING') {\n return false;\n }\n return state.isDragging;\n}\n\nconst tab = 9;\nconst enter = 13;\nconst escape = 27;\nconst space = 32;\nconst pageUp = 33;\nconst pageDown = 34;\nconst end = 35;\nconst home = 36;\nconst arrowLeft = 37;\nconst arrowUp = 38;\nconst arrowRight = 39;\nconst arrowDown = 40;\n\nconst preventedKeys = {\n [enter]: true,\n [tab]: true\n};\nvar preventStandardKeyEvents = event => {\n if (preventedKeys[event.keyCode]) {\n event.preventDefault();\n }\n};\n\nconst supportedEventName = (() => {\n const base = 'visibilitychange';\n if (typeof document === 'undefined') {\n return base;\n }\n const candidates = [base, `ms${base}`, `webkit${base}`, `moz${base}`, `o${base}`];\n const supported = candidates.find(eventName => `on${eventName}` in document);\n return supported || base;\n})();\n\nconst primaryButton = 0;\nconst sloppyClickThreshold = 5;\nfunction isSloppyClickThresholdExceeded(original, current) {\n return Math.abs(current.x - original.x) >= sloppyClickThreshold || Math.abs(current.y - original.y) >= sloppyClickThreshold;\n}\nconst idle$1 = {\n type: 'IDLE'\n};\nfunction getCaptureBindings({\n cancel,\n completed,\n getPhase,\n setPhase\n}) {\n return [{\n eventName: 'mousemove',\n fn: event => {\n const {\n button,\n clientX,\n clientY\n } = event;\n if (button !== primaryButton) {\n return;\n }\n const point = {\n x: clientX,\n y: clientY\n };\n const phase = getPhase();\n if (phase.type === 'DRAGGING') {\n event.preventDefault();\n phase.actions.move(point);\n return;\n }\n !(phase.type === 'PENDING') ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot be IDLE') : invariant() : void 0;\n const pending = phase.point;\n if (!isSloppyClickThresholdExceeded(pending, point)) {\n return;\n }\n event.preventDefault();\n const actions = phase.actions.fluidLift(point);\n setPhase({\n type: 'DRAGGING',\n actions\n });\n }\n }, {\n eventName: 'mouseup',\n fn: event => {\n const phase = getPhase();\n if (phase.type !== 'DRAGGING') {\n cancel();\n return;\n }\n event.preventDefault();\n phase.actions.drop({\n shouldBlockNextClick: true\n });\n completed();\n }\n }, {\n eventName: 'mousedown',\n fn: event => {\n if (getPhase().type === 'DRAGGING') {\n event.preventDefault();\n }\n cancel();\n }\n }, {\n eventName: 'keydown',\n fn: event => {\n const phase = getPhase();\n if (phase.type === 'PENDING') {\n cancel();\n return;\n }\n if (event.keyCode === escape) {\n event.preventDefault();\n cancel();\n return;\n }\n preventStandardKeyEvents(event);\n }\n }, {\n eventName: 'resize',\n fn: cancel\n }, {\n eventName: 'scroll',\n options: {\n passive: true,\n capture: false\n },\n fn: () => {\n if (getPhase().type === 'PENDING') {\n cancel();\n }\n }\n }, {\n eventName: 'webkitmouseforcedown',\n fn: event => {\n const phase = getPhase();\n !(phase.type !== 'IDLE') ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Unexpected phase') : invariant() : void 0;\n if (phase.actions.shouldRespectForcePress()) {\n cancel();\n return;\n }\n event.preventDefault();\n }\n }, {\n eventName: supportedEventName,\n fn: cancel\n }];\n}\nfunction useMouseSensor(api) {\n const phaseRef = useRef(idle$1);\n const unbindEventsRef = useRef(noop$2);\n const startCaptureBinding = useMemo(() => ({\n eventName: 'mousedown',\n fn: function onMouseDown(event) {\n if (event.defaultPrevented) {\n return;\n }\n if (event.button !== primaryButton) {\n return;\n }\n if (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) {\n return;\n }\n const draggableId = api.findClosestDraggableId(event);\n if (!draggableId) {\n return;\n }\n const actions = api.tryGetLock(draggableId, stop, {\n sourceEvent: event\n });\n if (!actions) {\n return;\n }\n event.preventDefault();\n const point = {\n x: event.clientX,\n y: event.clientY\n };\n unbindEventsRef.current();\n startPendingDrag(actions, point);\n }\n }), [api]);\n const preventForcePressBinding = useMemo(() => ({\n eventName: 'webkitmouseforcewillbegin',\n fn: event => {\n if (event.defaultPrevented) {\n return;\n }\n const id = api.findClosestDraggableId(event);\n if (!id) {\n return;\n }\n const options = api.findOptionsForDraggable(id);\n if (!options) {\n return;\n }\n if (options.shouldRespectForcePress) {\n return;\n }\n if (!api.canGetLock(id)) {\n return;\n }\n event.preventDefault();\n }\n }), [api]);\n const listenForCapture = useCallback(function listenForCapture() {\n const options = {\n passive: false,\n capture: true\n };\n unbindEventsRef.current = bindEvents(window, [preventForcePressBinding, startCaptureBinding], options);\n }, [preventForcePressBinding, startCaptureBinding]);\n const stop = useCallback(() => {\n const current = phaseRef.current;\n if (current.type === 'IDLE') {\n return;\n }\n phaseRef.current = idle$1;\n unbindEventsRef.current();\n listenForCapture();\n }, [listenForCapture]);\n const cancel = useCallback(() => {\n const phase = phaseRef.current;\n stop();\n if (phase.type === 'DRAGGING') {\n phase.actions.cancel({\n shouldBlockNextClick: true\n });\n }\n if (phase.type === 'PENDING') {\n phase.actions.abort();\n }\n }, [stop]);\n const bindCapturingEvents = useCallback(function bindCapturingEvents() {\n const options = {\n capture: true,\n passive: false\n };\n const bindings = getCaptureBindings({\n cancel,\n completed: stop,\n getPhase: () => phaseRef.current,\n setPhase: phase => {\n phaseRef.current = phase;\n }\n });\n unbindEventsRef.current = bindEvents(window, bindings, options);\n }, [cancel, stop]);\n const startPendingDrag = useCallback(function startPendingDrag(actions, point) {\n !(phaseRef.current.type === 'IDLE') ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Expected to move from IDLE to PENDING drag') : invariant() : void 0;\n phaseRef.current = {\n type: 'PENDING',\n point,\n actions\n };\n bindCapturingEvents();\n }, [bindCapturingEvents]);\n useIsomorphicLayoutEffect(function mount() {\n listenForCapture();\n return function unmount() {\n unbindEventsRef.current();\n };\n }, [listenForCapture]);\n}\n\nfunction noop$1() {}\nconst scrollJumpKeys = {\n [pageDown]: true,\n [pageUp]: true,\n [home]: true,\n [end]: true\n};\nfunction getDraggingBindings(actions, stop) {\n function cancel() {\n stop();\n actions.cancel();\n }\n function drop() {\n stop();\n actions.drop();\n }\n return [{\n eventName: 'keydown',\n fn: event => {\n if (event.keyCode === escape) {\n event.preventDefault();\n cancel();\n return;\n }\n if (event.keyCode === space) {\n event.preventDefault();\n drop();\n return;\n }\n if (event.keyCode === arrowDown) {\n event.preventDefault();\n actions.moveDown();\n return;\n }\n if (event.keyCode === arrowUp) {\n event.preventDefault();\n actions.moveUp();\n return;\n }\n if (event.keyCode === arrowRight) {\n event.preventDefault();\n actions.moveRight();\n return;\n }\n if (event.keyCode === arrowLeft) {\n event.preventDefault();\n actions.moveLeft();\n return;\n }\n if (scrollJumpKeys[event.keyCode]) {\n event.preventDefault();\n return;\n }\n preventStandardKeyEvents(event);\n }\n }, {\n eventName: 'mousedown',\n fn: cancel\n }, {\n eventName: 'mouseup',\n fn: cancel\n }, {\n eventName: 'click',\n fn: cancel\n }, {\n eventName: 'touchstart',\n fn: cancel\n }, {\n eventName: 'resize',\n fn: cancel\n }, {\n eventName: 'wheel',\n fn: cancel,\n options: {\n passive: true\n }\n }, {\n eventName: supportedEventName,\n fn: cancel\n }];\n}\nfunction useKeyboardSensor(api) {\n const unbindEventsRef = useRef(noop$1);\n const startCaptureBinding = useMemo(() => ({\n eventName: 'keydown',\n fn: function onKeyDown(event) {\n if (event.defaultPrevented) {\n return;\n }\n if (event.keyCode !== space) {\n return;\n }\n const draggableId = api.findClosestDraggableId(event);\n if (!draggableId) {\n return;\n }\n const preDrag = api.tryGetLock(draggableId, stop, {\n sourceEvent: event\n });\n if (!preDrag) {\n return;\n }\n event.preventDefault();\n let isCapturing = true;\n const actions = preDrag.snapLift();\n unbindEventsRef.current();\n function stop() {\n !isCapturing ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot stop capturing a keyboard drag when not capturing') : invariant() : void 0;\n isCapturing = false;\n unbindEventsRef.current();\n listenForCapture();\n }\n unbindEventsRef.current = bindEvents(window, getDraggingBindings(actions, stop), {\n capture: true,\n passive: false\n });\n }\n }), [api]);\n const listenForCapture = useCallback(function tryStartCapture() {\n const options = {\n passive: false,\n capture: true\n };\n unbindEventsRef.current = bindEvents(window, [startCaptureBinding], options);\n }, [startCaptureBinding]);\n useIsomorphicLayoutEffect(function mount() {\n listenForCapture();\n return function unmount() {\n unbindEventsRef.current();\n };\n }, [listenForCapture]);\n}\n\nconst idle = {\n type: 'IDLE'\n};\nconst timeForLongPress = 120;\nconst forcePressThreshold = 0.15;\nfunction getWindowBindings({\n cancel,\n getPhase\n}) {\n return [{\n eventName: 'orientationchange',\n fn: cancel\n }, {\n eventName: 'resize',\n fn: cancel\n }, {\n eventName: 'contextmenu',\n fn: event => {\n event.preventDefault();\n }\n }, {\n eventName: 'keydown',\n fn: event => {\n if (getPhase().type !== 'DRAGGING') {\n cancel();\n return;\n }\n if (event.keyCode === escape) {\n event.preventDefault();\n }\n cancel();\n }\n }, {\n eventName: supportedEventName,\n fn: cancel\n }];\n}\nfunction getHandleBindings({\n cancel,\n completed,\n getPhase\n}) {\n return [{\n eventName: 'touchmove',\n options: {\n capture: false\n },\n fn: event => {\n const phase = getPhase();\n if (phase.type !== 'DRAGGING') {\n cancel();\n return;\n }\n phase.hasMoved = true;\n const {\n clientX,\n clientY\n } = event.touches[0];\n const point = {\n x: clientX,\n y: clientY\n };\n event.preventDefault();\n phase.actions.move(point);\n }\n }, {\n eventName: 'touchend',\n fn: event => {\n const phase = getPhase();\n if (phase.type !== 'DRAGGING') {\n cancel();\n return;\n }\n event.preventDefault();\n phase.actions.drop({\n shouldBlockNextClick: true\n });\n completed();\n }\n }, {\n eventName: 'touchcancel',\n fn: event => {\n if (getPhase().type !== 'DRAGGING') {\n cancel();\n return;\n }\n event.preventDefault();\n cancel();\n }\n }, {\n eventName: 'touchforcechange',\n fn: event => {\n const phase = getPhase();\n !(phase.type !== 'IDLE') ? process.env.NODE_ENV !== \"production\" ? invariant() : invariant() : void 0;\n const touch = event.touches[0];\n if (!touch) {\n return;\n }\n const isForcePress = touch.force >= forcePressThreshold;\n if (!isForcePress) {\n return;\n }\n const shouldRespect = phase.actions.shouldRespectForcePress();\n if (phase.type === 'PENDING') {\n if (shouldRespect) {\n cancel();\n }\n return;\n }\n if (shouldRespect) {\n if (phase.hasMoved) {\n event.preventDefault();\n return;\n }\n cancel();\n return;\n }\n event.preventDefault();\n }\n }, {\n eventName: supportedEventName,\n fn: cancel\n }];\n}\nfunction useTouchSensor(api) {\n const phaseRef = useRef(idle);\n const unbindEventsRef = useRef(noop$2);\n const getPhase = useCallback(function getPhase() {\n return phaseRef.current;\n }, []);\n const setPhase = useCallback(function setPhase(phase) {\n phaseRef.current = phase;\n }, []);\n const startCaptureBinding = useMemo(() => ({\n eventName: 'touchstart',\n fn: function onTouchStart(event) {\n if (event.defaultPrevented) {\n return;\n }\n const draggableId = api.findClosestDraggableId(event);\n if (!draggableId) {\n return;\n }\n const actions = api.tryGetLock(draggableId, stop, {\n sourceEvent: event\n });\n if (!actions) {\n return;\n }\n const touch = event.touches[0];\n const {\n clientX,\n clientY\n } = touch;\n const point = {\n x: clientX,\n y: clientY\n };\n unbindEventsRef.current();\n startPendingDrag(actions, point);\n }\n }), [api]);\n const listenForCapture = useCallback(function listenForCapture() {\n const options = {\n capture: true,\n passive: false\n };\n unbindEventsRef.current = bindEvents(window, [startCaptureBinding], options);\n }, [startCaptureBinding]);\n const stop = useCallback(() => {\n const current = phaseRef.current;\n if (current.type === 'IDLE') {\n return;\n }\n if (current.type === 'PENDING') {\n clearTimeout(current.longPressTimerId);\n }\n setPhase(idle);\n unbindEventsRef.current();\n listenForCapture();\n }, [listenForCapture, setPhase]);\n const cancel = useCallback(() => {\n const phase = phaseRef.current;\n stop();\n if (phase.type === 'DRAGGING') {\n phase.actions.cancel({\n shouldBlockNextClick: true\n });\n }\n if (phase.type === 'PENDING') {\n phase.actions.abort();\n }\n }, [stop]);\n const bindCapturingEvents = useCallback(function bindCapturingEvents() {\n const options = {\n capture: true,\n passive: false\n };\n const args = {\n cancel,\n completed: stop,\n getPhase\n };\n const unbindTarget = bindEvents(window, getHandleBindings(args), options);\n const unbindWindow = bindEvents(window, getWindowBindings(args), options);\n unbindEventsRef.current = function unbindAll() {\n unbindTarget();\n unbindWindow();\n };\n }, [cancel, getPhase, stop]);\n const startDragging = useCallback(function startDragging() {\n const phase = getPhase();\n !(phase.type === 'PENDING') ? process.env.NODE_ENV !== \"production\" ? invariant(false, `Cannot start dragging from phase ${phase.type}`) : invariant() : void 0;\n const actions = phase.actions.fluidLift(phase.point);\n setPhase({\n type: 'DRAGGING',\n actions,\n hasMoved: false\n });\n }, [getPhase, setPhase]);\n const startPendingDrag = useCallback(function startPendingDrag(actions, point) {\n !(getPhase().type === 'IDLE') ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Expected to move from IDLE to PENDING drag') : invariant() : void 0;\n const longPressTimerId = setTimeout(startDragging, timeForLongPress);\n setPhase({\n type: 'PENDING',\n point,\n actions,\n longPressTimerId\n });\n bindCapturingEvents();\n }, [bindCapturingEvents, getPhase, setPhase, startDragging]);\n useIsomorphicLayoutEffect(function mount() {\n listenForCapture();\n return function unmount() {\n unbindEventsRef.current();\n const phase = getPhase();\n if (phase.type === 'PENDING') {\n clearTimeout(phase.longPressTimerId);\n setPhase(idle);\n }\n };\n }, [getPhase, listenForCapture, setPhase]);\n useIsomorphicLayoutEffect(function webkitHack() {\n const unbind = bindEvents(window, [{\n eventName: 'touchmove',\n fn: () => {},\n options: {\n capture: false,\n passive: false\n }\n }]);\n return unbind;\n }, []);\n}\n\nfunction useValidateSensorHooks(sensorHooks) {\n useDev(() => {\n const previousRef = usePrevious(sensorHooks);\n useDevSetupWarning(() => {\n !(previousRef.current.length === sensorHooks.length) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot change the amount of sensor hooks after mounting') : invariant(false) : void 0;\n });\n });\n}\n\nconst interactiveTagNames = ['input', 'button', 'textarea', 'select', 'option', 'optgroup', 'video', 'audio'];\nfunction isAnInteractiveElement(parent, current) {\n if (current == null) {\n return false;\n }\n const hasAnInteractiveTag = interactiveTagNames.includes(current.tagName.toLowerCase());\n if (hasAnInteractiveTag) {\n return true;\n }\n const attribute = current.getAttribute('contenteditable');\n if (attribute === 'true' || attribute === '') {\n return true;\n }\n if (current === parent) {\n return false;\n }\n return isAnInteractiveElement(parent, current.parentElement);\n}\nfunction isEventInInteractiveElement(draggable, event) {\n const target = event.target;\n if (!isHtmlElement(target)) {\n return false;\n }\n return isAnInteractiveElement(draggable, target);\n}\n\nvar getBorderBoxCenterPosition = el => getRect(el.getBoundingClientRect()).center;\n\nfunction isElement(el) {\n return el instanceof getWindowFromEl(el).Element;\n}\n\nconst supportedMatchesName = (() => {\n const base = 'matches';\n if (typeof document === 'undefined') {\n return base;\n }\n const candidates = [base, 'msMatchesSelector', 'webkitMatchesSelector'];\n const value = candidates.find(name => name in Element.prototype);\n return value || base;\n})();\nfunction closestPonyfill(el, selector) {\n if (el == null) {\n return null;\n }\n if (el[supportedMatchesName](selector)) {\n return el;\n }\n return closestPonyfill(el.parentElement, selector);\n}\nfunction closest(el, selector) {\n if (el.closest) {\n return el.closest(selector);\n }\n return closestPonyfill(el, selector);\n}\n\nfunction getSelector(contextId) {\n return `[${dragHandle.contextId}=\"${contextId}\"]`;\n}\nfunction findClosestDragHandleFromEvent(contextId, event) {\n const target = event.target;\n if (!isElement(target)) {\n process.env.NODE_ENV !== \"production\" ? warning('event.target must be a Element') : void 0;\n return null;\n }\n const selector = getSelector(contextId);\n const handle = closest(target, selector);\n if (!handle) {\n return null;\n }\n if (!isHtmlElement(handle)) {\n process.env.NODE_ENV !== \"production\" ? warning('drag handle must be a HTMLElement') : void 0;\n return null;\n }\n return handle;\n}\nfunction tryGetClosestDraggableIdFromEvent(contextId, event) {\n const handle = findClosestDragHandleFromEvent(contextId, event);\n if (!handle) {\n return null;\n }\n return handle.getAttribute(dragHandle.draggableId);\n}\n\nfunction findDraggable(contextId, draggableId) {\n const selector = `[${draggable.contextId}=\"${contextId}\"]`;\n const possible = querySelectorAll(document, selector);\n const draggable$1 = possible.find(el => {\n return el.getAttribute(draggable.id) === draggableId;\n });\n if (!draggable$1) {\n return null;\n }\n if (!isHtmlElement(draggable$1)) {\n process.env.NODE_ENV !== \"production\" ? warning('Draggable element is not a HTMLElement') : void 0;\n return null;\n }\n return draggable$1;\n}\n\nfunction preventDefault(event) {\n event.preventDefault();\n}\nfunction isActive({\n expected,\n phase,\n isLockActive,\n shouldWarn\n}) {\n if (!isLockActive()) {\n if (shouldWarn) {\n process.env.NODE_ENV !== \"production\" ? warning(`\n Cannot perform action.\n The sensor no longer has an action lock.\n\n Tips:\n\n - Throw away your action handlers when forceStop() is called\n - Check actions.isActive() if you really need to\n `) : void 0;\n }\n return false;\n }\n if (expected !== phase) {\n if (shouldWarn) {\n process.env.NODE_ENV !== \"production\" ? warning(`\n Cannot perform action.\n The actions you used belong to an outdated phase\n\n Current phase: ${expected}\n You called an action from outdated phase: ${phase}\n\n Tips:\n\n - Do not use preDragActions actions after calling preDragActions.lift()\n `) : void 0;\n }\n return false;\n }\n return true;\n}\nfunction canStart({\n lockAPI,\n store,\n registry,\n draggableId\n}) {\n if (lockAPI.isClaimed()) {\n return false;\n }\n const entry = registry.draggable.findById(draggableId);\n if (!entry) {\n process.env.NODE_ENV !== \"production\" ? warning(`Unable to find draggable with id: ${draggableId}`) : void 0;\n return false;\n }\n if (!entry.options.isEnabled) {\n return false;\n }\n if (!canStartDrag(store.getState(), draggableId)) {\n return false;\n }\n return true;\n}\nfunction tryStart({\n lockAPI,\n contextId,\n store,\n registry,\n draggableId,\n forceSensorStop,\n sourceEvent\n}) {\n const shouldStart = canStart({\n lockAPI,\n store,\n registry,\n draggableId\n });\n if (!shouldStart) {\n return null;\n }\n const entry = registry.draggable.getById(draggableId);\n const el = findDraggable(contextId, entry.descriptor.id);\n if (!el) {\n process.env.NODE_ENV !== \"production\" ? warning(`Unable to find draggable element with id: ${draggableId}`) : void 0;\n return null;\n }\n if (sourceEvent && !entry.options.canDragInteractiveElements && isEventInInteractiveElement(el, sourceEvent)) {\n return null;\n }\n const lock = lockAPI.claim(forceSensorStop || noop$2);\n let phase = 'PRE_DRAG';\n function getShouldRespectForcePress() {\n return entry.options.shouldRespectForcePress;\n }\n function isLockActive() {\n return lockAPI.isActive(lock);\n }\n function tryDispatch(expected, getAction) {\n if (isActive({\n expected,\n phase,\n isLockActive,\n shouldWarn: true\n })) {\n store.dispatch(getAction());\n }\n }\n const tryDispatchWhenDragging = tryDispatch.bind(null, 'DRAGGING');\n function lift(args) {\n function completed() {\n lockAPI.release();\n phase = 'COMPLETED';\n }\n if (phase !== 'PRE_DRAG') {\n completed();\n process.env.NODE_ENV !== \"production\" ? invariant(false, `Cannot lift in phase ${phase}`) : invariant() ;\n }\n store.dispatch(lift$1(args.liftActionArgs));\n phase = 'DRAGGING';\n function finish(reason, options = {\n shouldBlockNextClick: false\n }) {\n args.cleanup();\n if (options.shouldBlockNextClick) {\n const unbind = bindEvents(window, [{\n eventName: 'click',\n fn: preventDefault,\n options: {\n once: true,\n passive: false,\n capture: true\n }\n }]);\n setTimeout(unbind);\n }\n completed();\n store.dispatch(drop({\n reason\n }));\n }\n return {\n isActive: () => isActive({\n expected: 'DRAGGING',\n phase,\n isLockActive,\n shouldWarn: false\n }),\n shouldRespectForcePress: getShouldRespectForcePress,\n drop: options => finish('DROP', options),\n cancel: options => finish('CANCEL', options),\n ...args.actions\n };\n }\n function fluidLift(clientSelection) {\n const move$1 = rafSchd(client => {\n tryDispatchWhenDragging(() => move({\n client\n }));\n });\n const api = lift({\n liftActionArgs: {\n id: draggableId,\n clientSelection,\n movementMode: 'FLUID'\n },\n cleanup: () => move$1.cancel(),\n actions: {\n move: move$1\n }\n });\n return {\n ...api,\n move: move$1\n };\n }\n function snapLift() {\n const actions = {\n moveUp: () => tryDispatchWhenDragging(moveUp),\n moveRight: () => tryDispatchWhenDragging(moveRight),\n moveDown: () => tryDispatchWhenDragging(moveDown),\n moveLeft: () => tryDispatchWhenDragging(moveLeft)\n };\n return lift({\n liftActionArgs: {\n id: draggableId,\n clientSelection: getBorderBoxCenterPosition(el),\n movementMode: 'SNAP'\n },\n cleanup: noop$2,\n actions\n });\n }\n function abortPreDrag() {\n const shouldRelease = isActive({\n expected: 'PRE_DRAG',\n phase,\n isLockActive,\n shouldWarn: true\n });\n if (shouldRelease) {\n lockAPI.release();\n }\n }\n const preDrag = {\n isActive: () => isActive({\n expected: 'PRE_DRAG',\n phase,\n isLockActive,\n shouldWarn: false\n }),\n shouldRespectForcePress: getShouldRespectForcePress,\n fluidLift,\n snapLift,\n abort: abortPreDrag\n };\n return preDrag;\n}\nconst defaultSensors = [useMouseSensor, useKeyboardSensor, useTouchSensor];\nfunction useSensorMarshal({\n contextId,\n store,\n registry,\n customSensors,\n enableDefaultSensors\n}) {\n const useSensors = [...(enableDefaultSensors ? defaultSensors : []), ...(customSensors || [])];\n const lockAPI = useState(() => create())[0];\n const tryAbandonLock = useCallback(function tryAbandonLock(previous, current) {\n if (isDragging(previous) && !isDragging(current)) {\n lockAPI.tryAbandon();\n }\n }, [lockAPI]);\n useIsomorphicLayoutEffect(function listenToStore() {\n let previous = store.getState();\n const unsubscribe = store.subscribe(() => {\n const current = store.getState();\n tryAbandonLock(previous, current);\n previous = current;\n });\n return unsubscribe;\n }, [lockAPI, store, tryAbandonLock]);\n useIsomorphicLayoutEffect(() => {\n return lockAPI.tryAbandon;\n }, [lockAPI.tryAbandon]);\n const canGetLock = useCallback(draggableId => {\n return canStart({\n lockAPI,\n registry,\n store,\n draggableId\n });\n }, [lockAPI, registry, store]);\n const tryGetLock = useCallback((draggableId, forceStop, options) => tryStart({\n lockAPI,\n registry,\n contextId,\n store,\n draggableId,\n forceSensorStop: forceStop || null,\n sourceEvent: options && options.sourceEvent ? options.sourceEvent : null\n }), [contextId, lockAPI, registry, store]);\n const findClosestDraggableId = useCallback(event => tryGetClosestDraggableIdFromEvent(contextId, event), [contextId]);\n const findOptionsForDraggable = useCallback(id => {\n const entry = registry.draggable.findById(id);\n return entry ? entry.options : null;\n }, [registry.draggable]);\n const tryReleaseLock = useCallback(function tryReleaseLock() {\n if (!lockAPI.isClaimed()) {\n return;\n }\n lockAPI.tryAbandon();\n if (store.getState().phase !== 'IDLE') {\n store.dispatch(flush());\n }\n }, [lockAPI, store]);\n const isLockClaimed = useCallback(() => lockAPI.isClaimed(), [lockAPI]);\n const api = useMemo(() => ({\n canGetLock,\n tryGetLock,\n findClosestDraggableId,\n findOptionsForDraggable,\n tryReleaseLock,\n isLockClaimed\n }), [canGetLock, tryGetLock, findClosestDraggableId, findOptionsForDraggable, tryReleaseLock, isLockClaimed]);\n useValidateSensorHooks(useSensors);\n for (let i = 0; i < useSensors.length; i++) {\n useSensors[i](api);\n }\n}\n\nconst createResponders = props => ({\n onBeforeCapture: t => {\n const onBeforeCapureCallback = () => {\n if (props.onBeforeCapture) {\n props.onBeforeCapture(t);\n }\n };\n flushSync(onBeforeCapureCallback);\n },\n onBeforeDragStart: props.onBeforeDragStart,\n onDragStart: props.onDragStart,\n onDragEnd: props.onDragEnd,\n onDragUpdate: props.onDragUpdate\n});\nconst createAutoScrollerOptions = props => ({\n ...defaultAutoScrollerOptions,\n ...props.autoScrollerOptions,\n durationDampening: {\n ...defaultAutoScrollerOptions.durationDampening,\n ...props.autoScrollerOptions\n }\n});\nfunction getStore(lazyRef) {\n !lazyRef.current ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Could not find store from lazy ref') : invariant() : void 0;\n return lazyRef.current;\n}\nfunction App(props) {\n const {\n contextId,\n setCallbacks,\n sensors,\n nonce,\n dragHandleUsageInstructions\n } = props;\n const lazyStoreRef = useRef(null);\n useStartupValidation();\n const lastPropsRef = usePrevious(props);\n const getResponders = useCallback(() => {\n return createResponders(lastPropsRef.current);\n }, [lastPropsRef]);\n const getAutoScrollerOptions = useCallback(() => {\n return createAutoScrollerOptions(lastPropsRef.current);\n }, [lastPropsRef]);\n const announce = useAnnouncer(contextId);\n const dragHandleUsageInstructionsId = useHiddenTextElement({\n contextId,\n text: dragHandleUsageInstructions\n });\n const styleMarshal = useStyleMarshal(contextId, nonce);\n const lazyDispatch = useCallback(action => {\n getStore(lazyStoreRef).dispatch(action);\n }, []);\n const marshalCallbacks = useMemo(() => bindActionCreators({\n publishWhileDragging,\n updateDroppableScroll,\n updateDroppableIsEnabled,\n updateDroppableIsCombineEnabled,\n collectionStarting\n }, lazyDispatch), [lazyDispatch]);\n const registry = useRegistry();\n const dimensionMarshal = useMemo(() => {\n return createDimensionMarshal(registry, marshalCallbacks);\n }, [registry, marshalCallbacks]);\n const autoScroller = useMemo(() => createAutoScroller({\n scrollWindow,\n scrollDroppable: dimensionMarshal.scrollDroppable,\n getAutoScrollerOptions,\n ...bindActionCreators({\n move\n }, lazyDispatch)\n }), [dimensionMarshal.scrollDroppable, lazyDispatch, getAutoScrollerOptions]);\n const focusMarshal = useFocusMarshal(contextId);\n const store = useMemo(() => createStore({\n announce,\n autoScroller,\n dimensionMarshal,\n focusMarshal,\n getResponders,\n styleMarshal\n }), [announce, autoScroller, dimensionMarshal, focusMarshal, getResponders, styleMarshal]);\n if (process.env.NODE_ENV !== 'production') {\n if (lazyStoreRef.current && lazyStoreRef.current !== store) {\n process.env.NODE_ENV !== \"production\" ? warning('unexpected store change') : void 0;\n }\n }\n lazyStoreRef.current = store;\n const tryResetStore = useCallback(() => {\n const current = getStore(lazyStoreRef);\n const state = current.getState();\n if (state.phase !== 'IDLE') {\n current.dispatch(flush());\n }\n }, []);\n const isDragging = useCallback(() => {\n const state = getStore(lazyStoreRef).getState();\n if (state.phase === 'DROP_ANIMATING') {\n return true;\n }\n if (state.phase === 'IDLE') {\n return false;\n }\n return state.isDragging;\n }, []);\n const appCallbacks = useMemo(() => ({\n isDragging,\n tryAbort: tryResetStore\n }), [isDragging, tryResetStore]);\n setCallbacks(appCallbacks);\n const getCanLift = useCallback(id => canStartDrag(getStore(lazyStoreRef).getState(), id), []);\n const getIsMovementAllowed = useCallback(() => isMovementAllowed(getStore(lazyStoreRef).getState()), []);\n const appContext = useMemo(() => ({\n marshal: dimensionMarshal,\n focus: focusMarshal,\n contextId,\n canLift: getCanLift,\n isMovementAllowed: getIsMovementAllowed,\n dragHandleUsageInstructionsId,\n registry\n }), [contextId, dimensionMarshal, dragHandleUsageInstructionsId, focusMarshal, getCanLift, getIsMovementAllowed, registry]);\n useSensorMarshal({\n contextId,\n store,\n registry,\n customSensors: sensors || null,\n enableDefaultSensors: props.enableDefaultSensors !== false\n });\n useEffect(() => {\n return tryResetStore;\n }, [tryResetStore]);\n return React.createElement(AppContext.Provider, {\n value: appContext\n }, React.createElement(Provider, {\n context: StoreContext,\n store: store\n }, props.children));\n}\n\nfunction useUniqueContextId() {\n return React.useId();\n}\n\nfunction DragDropContext(props) {\n const contextId = useUniqueContextId();\n const dragHandleUsageInstructions = props.dragHandleUsageInstructions || preset.dragHandleUsageInstructions;\n return React.createElement(ErrorBoundary, null, setCallbacks => React.createElement(App, {\n nonce: props.nonce,\n contextId: contextId,\n setCallbacks: setCallbacks,\n dragHandleUsageInstructions: dragHandleUsageInstructions,\n enableDefaultSensors: props.enableDefaultSensors,\n sensors: props.sensors,\n onBeforeCapture: props.onBeforeCapture,\n onBeforeDragStart: props.onBeforeDragStart,\n onDragStart: props.onDragStart,\n onDragUpdate: props.onDragUpdate,\n onDragEnd: props.onDragEnd,\n autoScrollerOptions: props.autoScrollerOptions\n }, props.children));\n}\n\nconst zIndexOptions = {\n dragging: 5000,\n dropAnimating: 4500\n};\nconst getDraggingTransition = (shouldAnimateDragMovement, dropping) => {\n if (dropping) {\n return transitions.drop(dropping.duration);\n }\n if (shouldAnimateDragMovement) {\n return transitions.snap;\n }\n return transitions.fluid;\n};\nconst getDraggingOpacity = (isCombining, isDropAnimating) => {\n if (!isCombining) {\n return undefined;\n }\n return isDropAnimating ? combine.opacity.drop : combine.opacity.combining;\n};\nconst getShouldDraggingAnimate = dragging => {\n if (dragging.forceShouldAnimate != null) {\n return dragging.forceShouldAnimate;\n }\n return dragging.mode === 'SNAP';\n};\nfunction getDraggingStyle(dragging) {\n const dimension = dragging.dimension;\n const box = dimension.client;\n const {\n offset,\n combineWith,\n dropping\n } = dragging;\n const isCombining = Boolean(combineWith);\n const shouldAnimate = getShouldDraggingAnimate(dragging);\n const isDropAnimating = Boolean(dropping);\n const transform = isDropAnimating ? transforms.drop(offset, isCombining) : transforms.moveTo(offset);\n const style = {\n position: 'fixed',\n top: box.marginBox.top,\n left: box.marginBox.left,\n boxSizing: 'border-box',\n width: box.borderBox.width,\n height: box.borderBox.height,\n transition: getDraggingTransition(shouldAnimate, dropping),\n transform,\n opacity: getDraggingOpacity(isCombining, isDropAnimating),\n zIndex: isDropAnimating ? zIndexOptions.dropAnimating : zIndexOptions.dragging,\n pointerEvents: 'none'\n };\n return style;\n}\nfunction getSecondaryStyle(secondary) {\n return {\n transform: transforms.moveTo(secondary.offset),\n transition: secondary.shouldAnimateDisplacement ? undefined : 'none'\n };\n}\nfunction getStyle$1(mapped) {\n return mapped.type === 'DRAGGING' ? getDraggingStyle(mapped) : getSecondaryStyle(mapped);\n}\n\nfunction getDimension$1(descriptor, el, windowScroll = origin) {\n const computedStyles = window.getComputedStyle(el);\n const borderBox = el.getBoundingClientRect();\n const client = calculateBox(borderBox, computedStyles);\n const page = withScroll(client, windowScroll);\n const placeholder = {\n client,\n tagName: el.tagName.toLowerCase(),\n display: computedStyles.display\n };\n const displaceBy = {\n x: client.marginBox.width,\n y: client.marginBox.height\n };\n const dimension = {\n descriptor,\n placeholder,\n displaceBy,\n client,\n page\n };\n return dimension;\n}\n\nfunction useDraggablePublisher(args) {\n const uniqueId = useUniqueId('draggable');\n const {\n descriptor,\n registry,\n getDraggableRef,\n canDragInteractiveElements,\n shouldRespectForcePress,\n isEnabled\n } = args;\n const options = useMemo(() => ({\n canDragInteractiveElements,\n shouldRespectForcePress,\n isEnabled\n }), [canDragInteractiveElements, isEnabled, shouldRespectForcePress]);\n const getDimension = useCallback(windowScroll => {\n const el = getDraggableRef();\n !el ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot get dimension when no ref is set') : invariant() : void 0;\n return getDimension$1(descriptor, el, windowScroll);\n }, [descriptor, getDraggableRef]);\n const entry = useMemo(() => ({\n uniqueId,\n descriptor,\n options,\n getDimension\n }), [descriptor, getDimension, options, uniqueId]);\n const publishedRef = useRef(entry);\n const isFirstPublishRef = useRef(true);\n useIsomorphicLayoutEffect(() => {\n registry.draggable.register(publishedRef.current);\n return () => registry.draggable.unregister(publishedRef.current);\n }, [registry.draggable]);\n useIsomorphicLayoutEffect(() => {\n if (isFirstPublishRef.current) {\n isFirstPublishRef.current = false;\n return;\n }\n const last = publishedRef.current;\n publishedRef.current = entry;\n registry.draggable.update(entry, last);\n }, [entry, registry.draggable]);\n}\n\nvar DroppableContext = React.createContext(null);\n\nfunction checkIsValidInnerRef(el) {\n !(el && isHtmlElement(el)) ? process.env.NODE_ENV !== \"production\" ? invariant(false, `\n provided.innerRef has not been provided with a HTMLElement.\n\n You can find a guide on using the innerRef callback functions at:\n https://github.com/hello-pangea/dnd/blob/main/docs/guides/using-inner-ref.md\n `) : invariant() : void 0;\n}\n\nfunction useValidation$1(props, contextId, getRef) {\n useDevSetupWarning(() => {\n function prefix(id) {\n return `Draggable[id: ${id}]: `;\n }\n const id = props.draggableId;\n !id ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Draggable requires a draggableId') : invariant(false) : void 0;\n !(typeof id === 'string') ? process.env.NODE_ENV !== \"production\" ? invariant(false, `Draggable requires a [string] draggableId.\n Provided: [type: ${typeof id}] (value: ${id})`) : invariant(false) : void 0;\n !Number.isInteger(props.index) ? process.env.NODE_ENV !== \"production\" ? invariant(false, `${prefix(id)} requires an integer index prop`) : invariant(false) : void 0;\n if (props.mapped.type === 'DRAGGING') {\n return;\n }\n checkIsValidInnerRef(getRef());\n if (props.isEnabled) {\n !findDragHandle(contextId, id) ? process.env.NODE_ENV !== \"production\" ? invariant(false, `${prefix(id)} Unable to find drag handle`) : invariant(false) : void 0;\n }\n });\n}\nfunction useClonePropValidation(isClone) {\n useDev(() => {\n const initialRef = useRef(isClone);\n useDevSetupWarning(() => {\n !(isClone === initialRef.current) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Draggable isClone prop value changed during component life') : invariant(false) : void 0;\n }, [isClone]);\n });\n}\n\nfunction useRequiredContext(Context) {\n const result = useContext(Context);\n !result ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Could not find required context') : invariant() : void 0;\n return result;\n}\n\nfunction preventHtml5Dnd(event) {\n event.preventDefault();\n}\nconst Draggable = props => {\n const ref = useRef(null);\n const setRef = useCallback((el = null) => {\n ref.current = el;\n }, []);\n const getRef = useCallback(() => ref.current, []);\n const {\n contextId,\n dragHandleUsageInstructionsId,\n registry\n } = useRequiredContext(AppContext);\n const {\n type,\n droppableId\n } = useRequiredContext(DroppableContext);\n const descriptor = useMemo(() => ({\n id: props.draggableId,\n index: props.index,\n type,\n droppableId\n }), [props.draggableId, props.index, type, droppableId]);\n const {\n children,\n draggableId,\n isEnabled,\n shouldRespectForcePress,\n canDragInteractiveElements,\n isClone,\n mapped,\n dropAnimationFinished: dropAnimationFinishedAction\n } = props;\n useValidation$1(props, contextId, getRef);\n useClonePropValidation(isClone);\n if (!isClone) {\n const forPublisher = useMemo(() => ({\n descriptor,\n registry,\n getDraggableRef: getRef,\n canDragInteractiveElements,\n shouldRespectForcePress,\n isEnabled\n }), [descriptor, registry, getRef, canDragInteractiveElements, shouldRespectForcePress, isEnabled]);\n useDraggablePublisher(forPublisher);\n }\n const dragHandleProps = useMemo(() => isEnabled ? {\n tabIndex: 0,\n role: 'button',\n 'aria-describedby': dragHandleUsageInstructionsId,\n 'data-rfd-drag-handle-draggable-id': draggableId,\n 'data-rfd-drag-handle-context-id': contextId,\n draggable: false,\n onDragStart: preventHtml5Dnd\n } : null, [contextId, dragHandleUsageInstructionsId, draggableId, isEnabled]);\n const onMoveEnd = useCallback(event => {\n if (mapped.type !== 'DRAGGING') {\n return;\n }\n if (!mapped.dropping) {\n return;\n }\n if (event.propertyName !== 'transform') {\n return;\n }\n flushSync(dropAnimationFinishedAction);\n }, [dropAnimationFinishedAction, mapped]);\n const provided = useMemo(() => {\n const style = getStyle$1(mapped);\n const onTransitionEnd = mapped.type === 'DRAGGING' && mapped.dropping ? onMoveEnd : undefined;\n const result = {\n innerRef: setRef,\n draggableProps: {\n 'data-rfd-draggable-context-id': contextId,\n 'data-rfd-draggable-id': draggableId,\n style,\n onTransitionEnd\n },\n dragHandleProps\n };\n return result;\n }, [contextId, dragHandleProps, draggableId, mapped, onMoveEnd, setRef]);\n const rubric = useMemo(() => ({\n draggableId: descriptor.id,\n type: descriptor.type,\n source: {\n index: descriptor.index,\n droppableId: descriptor.droppableId\n }\n }), [descriptor.droppableId, descriptor.id, descriptor.index, descriptor.type]);\n return React.createElement(React.Fragment, null, children(provided, mapped.snapshot, rubric));\n};\n\nvar isStrictEqual = (a, b) => a === b;\n\nvar whatIsDraggedOverFromResult = result => {\n const {\n combine,\n destination\n } = result;\n if (destination) {\n return destination.droppableId;\n }\n if (combine) {\n return combine.droppableId;\n }\n return null;\n};\n\nconst getCombineWithFromResult = result => {\n return result.combine ? result.combine.draggableId : null;\n};\nconst getCombineWithFromImpact = impact => {\n return impact.at && impact.at.type === 'COMBINE' ? impact.at.combine.draggableId : null;\n};\nfunction getDraggableSelector() {\n const memoizedOffset = memoizeOne((x, y) => ({\n x,\n y\n }));\n const getMemoizedSnapshot = memoizeOne((mode, isClone, draggingOver = null, combineWith = null, dropping = null) => ({\n isDragging: true,\n isClone,\n isDropAnimating: Boolean(dropping),\n dropAnimation: dropping,\n mode,\n draggingOver,\n combineWith,\n combineTargetFor: null\n }));\n const getMemoizedProps = memoizeOne((offset, mode, dimension, isClone, draggingOver = null, combineWith = null, forceShouldAnimate = null) => ({\n mapped: {\n type: 'DRAGGING',\n dropping: null,\n draggingOver,\n combineWith,\n mode,\n offset,\n dimension,\n forceShouldAnimate,\n snapshot: getMemoizedSnapshot(mode, isClone, draggingOver, combineWith, null)\n }\n }));\n const selector = (state, ownProps) => {\n if (isDragging(state)) {\n if (state.critical.draggable.id !== ownProps.draggableId) {\n return null;\n }\n const offset = state.current.client.offset;\n const dimension = state.dimensions.draggables[ownProps.draggableId];\n const draggingOver = whatIsDraggedOver(state.impact);\n const combineWith = getCombineWithFromImpact(state.impact);\n const forceShouldAnimate = state.forceShouldAnimate;\n return getMemoizedProps(memoizedOffset(offset.x, offset.y), state.movementMode, dimension, ownProps.isClone, draggingOver, combineWith, forceShouldAnimate);\n }\n if (state.phase === 'DROP_ANIMATING') {\n const completed = state.completed;\n if (completed.result.draggableId !== ownProps.draggableId) {\n return null;\n }\n const isClone = ownProps.isClone;\n const dimension = state.dimensions.draggables[ownProps.draggableId];\n const result = completed.result;\n const mode = result.mode;\n const draggingOver = whatIsDraggedOverFromResult(result);\n const combineWith = getCombineWithFromResult(result);\n const duration = state.dropDuration;\n const dropping = {\n duration,\n curve: curves.drop,\n moveTo: state.newHomeClientOffset,\n opacity: combineWith ? combine.opacity.drop : null,\n scale: combineWith ? combine.scale.drop : null\n };\n return {\n mapped: {\n type: 'DRAGGING',\n offset: state.newHomeClientOffset,\n dimension,\n dropping,\n draggingOver,\n combineWith,\n mode,\n forceShouldAnimate: null,\n snapshot: getMemoizedSnapshot(mode, isClone, draggingOver, combineWith, dropping)\n }\n };\n }\n return null;\n };\n return selector;\n}\nfunction getSecondarySnapshot(combineTargetFor = null) {\n return {\n isDragging: false,\n isDropAnimating: false,\n isClone: false,\n dropAnimation: null,\n mode: null,\n draggingOver: null,\n combineTargetFor,\n combineWith: null\n };\n}\nconst atRest = {\n mapped: {\n type: 'SECONDARY',\n offset: origin,\n combineTargetFor: null,\n shouldAnimateDisplacement: true,\n snapshot: getSecondarySnapshot(null)\n }\n};\nfunction getSecondarySelector() {\n const memoizedOffset = memoizeOne((x, y) => ({\n x,\n y\n }));\n const getMemoizedSnapshot = memoizeOne(getSecondarySnapshot);\n const getMemoizedProps = memoizeOne((offset, combineTargetFor = null, shouldAnimateDisplacement) => ({\n mapped: {\n type: 'SECONDARY',\n offset,\n combineTargetFor,\n shouldAnimateDisplacement,\n snapshot: getMemoizedSnapshot(combineTargetFor)\n }\n }));\n const getFallback = combineTargetFor => {\n return combineTargetFor ? getMemoizedProps(origin, combineTargetFor, true) : null;\n };\n const getProps = (ownId, draggingId, impact, afterCritical) => {\n const visualDisplacement = impact.displaced.visible[ownId];\n const isAfterCriticalInVirtualList = Boolean(afterCritical.inVirtualList && afterCritical.effected[ownId]);\n const combine = tryGetCombine(impact);\n const combineTargetFor = combine && combine.draggableId === ownId ? draggingId : null;\n if (!visualDisplacement) {\n if (!isAfterCriticalInVirtualList) {\n return getFallback(combineTargetFor);\n }\n if (impact.displaced.invisible[ownId]) {\n return null;\n }\n const change = negate(afterCritical.displacedBy.point);\n const offset = memoizedOffset(change.x, change.y);\n return getMemoizedProps(offset, combineTargetFor, true);\n }\n if (isAfterCriticalInVirtualList) {\n return getFallback(combineTargetFor);\n }\n const displaceBy = impact.displacedBy.point;\n const offset = memoizedOffset(displaceBy.x, displaceBy.y);\n return getMemoizedProps(offset, combineTargetFor, visualDisplacement.shouldAnimate);\n };\n const selector = (state, ownProps) => {\n if (isDragging(state)) {\n if (state.critical.draggable.id === ownProps.draggableId) {\n return null;\n }\n return getProps(ownProps.draggableId, state.critical.draggable.id, state.impact, state.afterCritical);\n }\n if (state.phase === 'DROP_ANIMATING') {\n const completed = state.completed;\n if (completed.result.draggableId === ownProps.draggableId) {\n return null;\n }\n return getProps(ownProps.draggableId, completed.result.draggableId, completed.impact, completed.afterCritical);\n }\n return null;\n };\n return selector;\n}\nconst makeMapStateToProps$1 = () => {\n const draggingSelector = getDraggableSelector();\n const secondarySelector = getSecondarySelector();\n const selector = (state, ownProps) => draggingSelector(state, ownProps) || secondarySelector(state, ownProps) || atRest;\n return selector;\n};\nconst mapDispatchToProps$1 = {\n dropAnimationFinished: dropAnimationFinished\n};\nconst ConnectedDraggable = connect(makeMapStateToProps$1, mapDispatchToProps$1, null, {\n context: StoreContext,\n areStatePropsEqual: isStrictEqual\n})(Draggable);\n\nfunction PrivateDraggable(props) {\n const droppableContext = useRequiredContext(DroppableContext);\n const isUsingCloneFor = droppableContext.isUsingCloneFor;\n if (isUsingCloneFor === props.draggableId && !props.isClone) {\n return null;\n }\n return React.createElement(ConnectedDraggable, props);\n}\nfunction PublicDraggable(props) {\n const isEnabled = typeof props.isDragDisabled === 'boolean' ? !props.isDragDisabled : true;\n const canDragInteractiveElements = Boolean(props.disableInteractiveElementBlocking);\n const shouldRespectForcePress = Boolean(props.shouldRespectForcePress);\n return React.createElement(PrivateDraggable, _extends({}, props, {\n isClone: false,\n isEnabled: isEnabled,\n canDragInteractiveElements: canDragInteractiveElements,\n shouldRespectForcePress: shouldRespectForcePress\n }));\n}\n\nconst isEqual = base => value => base === value;\nconst isScroll = isEqual('scroll');\nconst isAuto = isEqual('auto');\nconst isVisible = isEqual('visible');\nconst isEither = (overflow, fn) => fn(overflow.overflowX) || fn(overflow.overflowY);\nconst isBoth = (overflow, fn) => fn(overflow.overflowX) && fn(overflow.overflowY);\nconst isElementScrollable = el => {\n const style = window.getComputedStyle(el);\n const overflow = {\n overflowX: style.overflowX,\n overflowY: style.overflowY\n };\n return isEither(overflow, isScroll) || isEither(overflow, isAuto);\n};\nconst isBodyScrollable = () => {\n if (process.env.NODE_ENV === 'production') {\n return false;\n }\n const body = getBodyElement();\n const html = document.documentElement;\n !html ? process.env.NODE_ENV !== \"production\" ? invariant() : invariant() : void 0;\n if (!isElementScrollable(body)) {\n return false;\n }\n const htmlStyle = window.getComputedStyle(html);\n const htmlOverflow = {\n overflowX: htmlStyle.overflowX,\n overflowY: htmlStyle.overflowY\n };\n if (isBoth(htmlOverflow, isVisible)) {\n return false;\n }\n process.env.NODE_ENV !== \"production\" ? warning(`\n We have detected that your <body> element might be a scroll container.\n We have found no reliable way of detecting whether the <body> element is a scroll container.\n Under most circumstances a <body> scroll bar will be on the <html> element (document.documentElement)\n\n Because we cannot determine if the <body> is a scroll container, and generally it is not one,\n we will be treating the <body> as *not* a scroll container\n\n More information: https://github.com/hello-pangea/dnd/blob/main/docs/guides/how-we-detect-scroll-containers.md\n `) : void 0;\n return false;\n};\nconst getClosestScrollable = el => {\n if (el == null) {\n return null;\n }\n if (el === document.body) {\n return isBodyScrollable() ? el : null;\n }\n if (el === document.documentElement) {\n return null;\n }\n if (!isElementScrollable(el)) {\n return getClosestScrollable(el.parentElement);\n }\n return el;\n};\n\nvar checkForNestedScrollContainers = scrollable => {\n if (!scrollable) {\n return;\n }\n const anotherScrollParent = getClosestScrollable(scrollable.parentElement);\n if (!anotherScrollParent) {\n return;\n }\n process.env.NODE_ENV !== \"production\" ? warning(`\n Droppable: unsupported nested scroll container detected.\n A Droppable can only have one scroll parent (which can be itself)\n Nested scroll containers are currently not supported.\n\n We hope to support nested scroll containers soon: https://github.com/atlassian/react-beautiful-dnd/issues/131\n `) : void 0;\n};\n\nvar getScroll = el => ({\n x: el.scrollLeft,\n y: el.scrollTop\n});\n\nconst getIsFixed = el => {\n if (!el) {\n return false;\n }\n const style = window.getComputedStyle(el);\n if (style.position === 'fixed') {\n return true;\n }\n return getIsFixed(el.parentElement);\n};\nvar getEnv = start => {\n const closestScrollable = getClosestScrollable(start);\n const isFixedOnPage = getIsFixed(start);\n return {\n closestScrollable,\n isFixedOnPage\n };\n};\n\nvar getDroppableDimension = ({\n descriptor,\n isEnabled,\n isCombineEnabled,\n isFixedOnPage,\n direction,\n client,\n page,\n closest\n}) => {\n const frame = (() => {\n if (!closest) {\n return null;\n }\n const {\n scrollSize,\n client: frameClient\n } = closest;\n const maxScroll = getMaxScroll({\n scrollHeight: scrollSize.scrollHeight,\n scrollWidth: scrollSize.scrollWidth,\n height: frameClient.paddingBox.height,\n width: frameClient.paddingBox.width\n });\n return {\n pageMarginBox: closest.page.marginBox,\n frameClient,\n scrollSize,\n shouldClipSubject: closest.shouldClipSubject,\n scroll: {\n initial: closest.scroll,\n current: closest.scroll,\n max: maxScroll,\n diff: {\n value: origin,\n displacement: origin\n }\n }\n };\n })();\n const axis = direction === 'vertical' ? vertical : horizontal;\n const subject = getSubject({\n page,\n withPlaceholder: null,\n axis,\n frame\n });\n const dimension = {\n descriptor,\n isCombineEnabled,\n isFixedOnPage,\n axis,\n isEnabled,\n client,\n page,\n frame,\n subject\n };\n return dimension;\n};\n\nconst getClient = (targetRef, closestScrollable) => {\n const base = getBox(targetRef);\n if (!closestScrollable) {\n return base;\n }\n if (targetRef !== closestScrollable) {\n return base;\n }\n const top = base.paddingBox.top - closestScrollable.scrollTop;\n const left = base.paddingBox.left - closestScrollable.scrollLeft;\n const bottom = top + closestScrollable.scrollHeight;\n const right = left + closestScrollable.scrollWidth;\n const paddingBox = {\n top,\n right,\n bottom,\n left\n };\n const borderBox = expand(paddingBox, base.border);\n const client = createBox({\n borderBox,\n margin: base.margin,\n border: base.border,\n padding: base.padding\n });\n return client;\n};\nvar getDimension = ({\n ref,\n descriptor,\n env,\n windowScroll,\n direction,\n isDropDisabled,\n isCombineEnabled,\n shouldClipSubject\n}) => {\n const closestScrollable = env.closestScrollable;\n const client = getClient(ref, closestScrollable);\n const page = withScroll(client, windowScroll);\n const closest = (() => {\n if (!closestScrollable) {\n return null;\n }\n const frameClient = getBox(closestScrollable);\n const scrollSize = {\n scrollHeight: closestScrollable.scrollHeight,\n scrollWidth: closestScrollable.scrollWidth\n };\n return {\n client: frameClient,\n page: withScroll(frameClient, windowScroll),\n scroll: getScroll(closestScrollable),\n scrollSize,\n shouldClipSubject\n };\n })();\n const dimension = getDroppableDimension({\n descriptor,\n isEnabled: !isDropDisabled,\n isCombineEnabled,\n isFixedOnPage: env.isFixedOnPage,\n direction,\n client,\n page,\n closest\n });\n return dimension;\n};\n\nconst immediate = {\n passive: false\n};\nconst delayed = {\n passive: true\n};\nvar getListenerOptions = options => options.shouldPublishImmediately ? immediate : delayed;\n\nconst getClosestScrollableFromDrag = dragging => dragging && dragging.env.closestScrollable || null;\nfunction useDroppablePublisher(args) {\n const whileDraggingRef = useRef(null);\n const appContext = useRequiredContext(AppContext);\n const uniqueId = useUniqueId('droppable');\n const {\n registry,\n marshal\n } = appContext;\n const previousRef = usePrevious(args);\n const descriptor = useMemo(() => ({\n id: args.droppableId,\n type: args.type,\n mode: args.mode\n }), [args.droppableId, args.mode, args.type]);\n const publishedDescriptorRef = useRef(descriptor);\n const memoizedUpdateScroll = useMemo(() => memoizeOne((x, y) => {\n !whileDraggingRef.current ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Can only update scroll when dragging') : invariant() : void 0;\n const scroll = {\n x,\n y\n };\n marshal.updateDroppableScroll(descriptor.id, scroll);\n }), [descriptor.id, marshal]);\n const getClosestScroll = useCallback(() => {\n const dragging = whileDraggingRef.current;\n if (!dragging || !dragging.env.closestScrollable) {\n return origin;\n }\n return getScroll(dragging.env.closestScrollable);\n }, []);\n const updateScroll = useCallback(() => {\n const scroll = getClosestScroll();\n memoizedUpdateScroll(scroll.x, scroll.y);\n }, [getClosestScroll, memoizedUpdateScroll]);\n const scheduleScrollUpdate = useMemo(() => rafSchd(updateScroll), [updateScroll]);\n const onClosestScroll = useCallback(() => {\n const dragging = whileDraggingRef.current;\n const closest = getClosestScrollableFromDrag(dragging);\n !(dragging && closest) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Could not find scroll options while scrolling') : invariant() : void 0;\n const options = dragging.scrollOptions;\n if (options.shouldPublishImmediately) {\n updateScroll();\n return;\n }\n scheduleScrollUpdate();\n }, [scheduleScrollUpdate, updateScroll]);\n const getDimensionAndWatchScroll = useCallback((windowScroll, options) => {\n !!whileDraggingRef.current ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot collect a droppable while a drag is occurring') : invariant() : void 0;\n const previous = previousRef.current;\n const ref = previous.getDroppableRef();\n !ref ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot collect without a droppable ref') : invariant() : void 0;\n const env = getEnv(ref);\n const dragging = {\n ref,\n descriptor,\n env,\n scrollOptions: options\n };\n whileDraggingRef.current = dragging;\n const dimension = getDimension({\n ref,\n descriptor,\n env,\n windowScroll,\n direction: previous.direction,\n isDropDisabled: previous.isDropDisabled,\n isCombineEnabled: previous.isCombineEnabled,\n shouldClipSubject: !previous.ignoreContainerClipping\n });\n const scrollable = env.closestScrollable;\n if (scrollable) {\n scrollable.setAttribute(scrollContainer.contextId, appContext.contextId);\n scrollable.addEventListener('scroll', onClosestScroll, getListenerOptions(dragging.scrollOptions));\n if (process.env.NODE_ENV !== 'production') {\n checkForNestedScrollContainers(scrollable);\n }\n }\n return dimension;\n }, [appContext.contextId, descriptor, onClosestScroll, previousRef]);\n const getScrollWhileDragging = useCallback(() => {\n const dragging = whileDraggingRef.current;\n const closest = getClosestScrollableFromDrag(dragging);\n !(dragging && closest) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Can only recollect Droppable client for Droppables that have a scroll container') : invariant() : void 0;\n return getScroll(closest);\n }, []);\n const dragStopped = useCallback(() => {\n const dragging = whileDraggingRef.current;\n !dragging ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot stop drag when no active drag') : invariant() : void 0;\n const closest = getClosestScrollableFromDrag(dragging);\n whileDraggingRef.current = null;\n if (!closest) {\n return;\n }\n scheduleScrollUpdate.cancel();\n closest.removeAttribute(scrollContainer.contextId);\n closest.removeEventListener('scroll', onClosestScroll, getListenerOptions(dragging.scrollOptions));\n }, [onClosestScroll, scheduleScrollUpdate]);\n const scroll = useCallback(change => {\n const dragging = whileDraggingRef.current;\n !dragging ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot scroll when there is no drag') : invariant() : void 0;\n const closest = getClosestScrollableFromDrag(dragging);\n !closest ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot scroll a droppable with no closest scrollable') : invariant() : void 0;\n closest.scrollTop += change.y;\n closest.scrollLeft += change.x;\n }, []);\n const callbacks = useMemo(() => {\n return {\n getDimensionAndWatchScroll,\n getScrollWhileDragging,\n dragStopped,\n scroll\n };\n }, [dragStopped, getDimensionAndWatchScroll, getScrollWhileDragging, scroll]);\n const entry = useMemo(() => ({\n uniqueId,\n descriptor,\n callbacks\n }), [callbacks, descriptor, uniqueId]);\n useIsomorphicLayoutEffect(() => {\n publishedDescriptorRef.current = entry.descriptor;\n registry.droppable.register(entry);\n return () => {\n if (whileDraggingRef.current) {\n process.env.NODE_ENV !== \"production\" ? warning('Unsupported: changing the droppableId or type of a Droppable during a drag') : void 0;\n dragStopped();\n }\n registry.droppable.unregister(entry);\n };\n }, [callbacks, descriptor, dragStopped, entry, marshal, registry.droppable]);\n useIsomorphicLayoutEffect(() => {\n if (!whileDraggingRef.current) {\n return;\n }\n marshal.updateDroppableIsEnabled(publishedDescriptorRef.current.id, !args.isDropDisabled);\n }, [args.isDropDisabled, marshal]);\n useIsomorphicLayoutEffect(() => {\n if (!whileDraggingRef.current) {\n return;\n }\n marshal.updateDroppableIsCombineEnabled(publishedDescriptorRef.current.id, args.isCombineEnabled);\n }, [args.isCombineEnabled, marshal]);\n}\n\nfunction noop() {}\nconst empty = {\n width: 0,\n height: 0,\n margin: noSpacing\n};\nconst getSize = ({\n isAnimatingOpenOnMount,\n placeholder,\n animate\n}) => {\n if (isAnimatingOpenOnMount) {\n return empty;\n }\n if (animate === 'close') {\n return empty;\n }\n return {\n height: placeholder.client.borderBox.height,\n width: placeholder.client.borderBox.width,\n margin: placeholder.client.margin\n };\n};\nconst getStyle = ({\n isAnimatingOpenOnMount,\n placeholder,\n animate\n}) => {\n const size = getSize({\n isAnimatingOpenOnMount,\n placeholder,\n animate\n });\n return {\n display: placeholder.display,\n boxSizing: 'border-box',\n width: size.width,\n height: size.height,\n marginTop: size.margin.top,\n marginRight: size.margin.right,\n marginBottom: size.margin.bottom,\n marginLeft: size.margin.left,\n flexShrink: '0',\n flexGrow: '0',\n pointerEvents: 'none',\n transition: animate !== 'none' ? transitions.placeholder : null\n };\n};\nconst Placeholder = props => {\n const animateOpenTimerRef = useRef(null);\n const tryClearAnimateOpenTimer = useCallback(() => {\n if (!animateOpenTimerRef.current) {\n return;\n }\n clearTimeout(animateOpenTimerRef.current);\n animateOpenTimerRef.current = null;\n }, []);\n const {\n animate,\n onTransitionEnd,\n onClose,\n contextId\n } = props;\n const [isAnimatingOpenOnMount, setIsAnimatingOpenOnMount] = useState(props.animate === 'open');\n useEffect(() => {\n if (!isAnimatingOpenOnMount) {\n return noop;\n }\n if (animate !== 'open') {\n tryClearAnimateOpenTimer();\n setIsAnimatingOpenOnMount(false);\n return noop;\n }\n if (animateOpenTimerRef.current) {\n return noop;\n }\n animateOpenTimerRef.current = setTimeout(() => {\n animateOpenTimerRef.current = null;\n setIsAnimatingOpenOnMount(false);\n });\n return tryClearAnimateOpenTimer;\n }, [animate, isAnimatingOpenOnMount, tryClearAnimateOpenTimer]);\n const onSizeChangeEnd = useCallback(event => {\n if (event.propertyName !== 'height') {\n return;\n }\n onTransitionEnd();\n if (animate === 'close') {\n onClose();\n }\n }, [animate, onClose, onTransitionEnd]);\n const style = getStyle({\n isAnimatingOpenOnMount,\n animate: props.animate,\n placeholder: props.placeholder\n });\n return React.createElement(props.placeholder.tagName, {\n style,\n 'data-rfd-placeholder-context-id': contextId,\n onTransitionEnd: onSizeChangeEnd,\n ref: props.innerRef\n });\n};\nvar Placeholder$1 = React.memo(Placeholder);\n\nfunction isBoolean(value) {\n return typeof value === 'boolean';\n}\nfunction runChecks(args, checks) {\n checks.forEach(check => check(args));\n}\nconst shared = [function required({\n props\n}) {\n !props.droppableId ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'A Droppable requires a droppableId prop') : invariant() : void 0;\n !(typeof props.droppableId === 'string') ? process.env.NODE_ENV !== \"production\" ? invariant(false, `A Droppable requires a [string] droppableId. Provided: [${typeof props.droppableId}]`) : invariant() : void 0;\n}, function boolean({\n props\n}) {\n !isBoolean(props.isDropDisabled) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'isDropDisabled must be a boolean') : invariant() : void 0;\n !isBoolean(props.isCombineEnabled) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'isCombineEnabled must be a boolean') : invariant() : void 0;\n !isBoolean(props.ignoreContainerClipping) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'ignoreContainerClipping must be a boolean') : invariant() : void 0;\n}, function ref({\n getDroppableRef\n}) {\n checkIsValidInnerRef(getDroppableRef());\n}];\nconst standard = [function placeholder({\n props,\n getPlaceholderRef\n}) {\n if (!props.placeholder) {\n return;\n }\n const ref = getPlaceholderRef();\n if (ref) {\n return;\n }\n process.env.NODE_ENV !== \"production\" ? warning(`\n Droppable setup issue [droppableId: \"${props.droppableId}\"]:\n DroppableProvided > placeholder could not be found.\n\n Please be sure to add the {provided.placeholder} React Node as a child of your Droppable.\n More information: https://github.com/hello-pangea/dnd/blob/main/docs/api/droppable.md\n `) : void 0;\n}];\nconst virtual = [function hasClone({\n props\n}) {\n !props.renderClone ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Must provide a clone render function (renderClone) for virtual lists') : invariant() : void 0;\n}, function hasNoPlaceholder({\n getPlaceholderRef\n}) {\n !!getPlaceholderRef() ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Expected virtual list to not have a placeholder') : invariant() : void 0;\n}];\nfunction useValidation(args) {\n useDevSetupWarning(() => {\n runChecks(args, shared);\n if (args.props.mode === 'standard') {\n runChecks(args, standard);\n }\n if (args.props.mode === 'virtual') {\n runChecks(args, virtual);\n }\n });\n}\n\nclass AnimateInOut extends React.PureComponent {\n constructor(...args) {\n super(...args);\n this.state = {\n isVisible: Boolean(this.props.on),\n data: this.props.on,\n animate: this.props.shouldAnimate && this.props.on ? 'open' : 'none'\n };\n this.onClose = () => {\n if (this.state.animate !== 'close') {\n return;\n }\n this.setState({\n isVisible: false\n });\n };\n }\n static getDerivedStateFromProps(props, state) {\n if (!props.shouldAnimate) {\n return {\n isVisible: Boolean(props.on),\n data: props.on,\n animate: 'none'\n };\n }\n if (props.on) {\n return {\n isVisible: true,\n data: props.on,\n animate: 'open'\n };\n }\n if (state.isVisible) {\n return {\n isVisible: true,\n data: state.data,\n animate: 'close'\n };\n }\n return {\n isVisible: false,\n animate: 'close',\n data: null\n };\n }\n render() {\n if (!this.state.isVisible) {\n return null;\n }\n const provided = {\n onClose: this.onClose,\n data: this.state.data,\n animate: this.state.animate\n };\n return this.props.children(provided);\n }\n}\n\nconst Droppable = props => {\n const appContext = useContext(AppContext);\n !appContext ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Could not find app context') : invariant() : void 0;\n const {\n contextId,\n isMovementAllowed\n } = appContext;\n const droppableRef = useRef(null);\n const placeholderRef = useRef(null);\n const {\n children,\n droppableId,\n type,\n mode,\n direction,\n ignoreContainerClipping,\n isDropDisabled,\n isCombineEnabled,\n snapshot,\n useClone,\n updateViewportMaxScroll,\n getContainerForClone\n } = props;\n const getDroppableRef = useCallback(() => droppableRef.current, []);\n const setDroppableRef = useCallback((value = null) => {\n droppableRef.current = value;\n }, []);\n const getPlaceholderRef = useCallback(() => placeholderRef.current, []);\n const setPlaceholderRef = useCallback((value = null) => {\n placeholderRef.current = value;\n }, []);\n useValidation({\n props,\n getDroppableRef,\n getPlaceholderRef\n });\n const onPlaceholderTransitionEnd = useCallback(() => {\n if (isMovementAllowed()) {\n updateViewportMaxScroll({\n maxScroll: getMaxWindowScroll()\n });\n }\n }, [isMovementAllowed, updateViewportMaxScroll]);\n useDroppablePublisher({\n droppableId,\n type,\n mode,\n direction,\n isDropDisabled,\n isCombineEnabled,\n ignoreContainerClipping,\n getDroppableRef\n });\n const placeholder = useMemo(() => React.createElement(AnimateInOut, {\n on: props.placeholder,\n shouldAnimate: props.shouldAnimatePlaceholder\n }, ({\n onClose,\n data,\n animate\n }) => React.createElement(Placeholder$1, {\n placeholder: data,\n onClose: onClose,\n innerRef: setPlaceholderRef,\n animate: animate,\n contextId: contextId,\n onTransitionEnd: onPlaceholderTransitionEnd\n })), [contextId, onPlaceholderTransitionEnd, props.placeholder, props.shouldAnimatePlaceholder, setPlaceholderRef]);\n const provided = useMemo(() => ({\n innerRef: setDroppableRef,\n placeholder,\n droppableProps: {\n 'data-rfd-droppable-id': droppableId,\n 'data-rfd-droppable-context-id': contextId\n }\n }), [contextId, droppableId, placeholder, setDroppableRef]);\n const isUsingCloneFor = useClone ? useClone.dragging.draggableId : null;\n const droppableContext = useMemo(() => ({\n droppableId,\n type,\n isUsingCloneFor\n }), [droppableId, isUsingCloneFor, type]);\n function getClone() {\n if (!useClone) {\n return null;\n }\n const {\n dragging,\n render\n } = useClone;\n const node = React.createElement(PrivateDraggable, {\n draggableId: dragging.draggableId,\n index: dragging.source.index,\n isClone: true,\n isEnabled: true,\n shouldRespectForcePress: false,\n canDragInteractiveElements: true\n }, (draggableProvided, draggableSnapshot) => render(draggableProvided, draggableSnapshot, dragging));\n return ReactDOM.createPortal(node, getContainerForClone());\n }\n return React.createElement(DroppableContext.Provider, {\n value: droppableContext\n }, children(provided, snapshot), getClone());\n};\n\nfunction getBody() {\n !document.body ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'document.body is not ready') : invariant() : void 0;\n return document.body;\n}\nconst defaultProps = {\n mode: 'standard',\n type: 'DEFAULT',\n direction: 'vertical',\n isDropDisabled: false,\n isCombineEnabled: false,\n ignoreContainerClipping: false,\n renderClone: null,\n getContainerForClone: getBody\n};\nconst attachDefaultPropsToOwnProps = ownProps => {\n let mergedProps = {\n ...ownProps\n };\n let defaultPropKey;\n for (defaultPropKey in defaultProps) {\n if (ownProps[defaultPropKey] === undefined) {\n mergedProps = {\n ...mergedProps,\n [defaultPropKey]: defaultProps[defaultPropKey]\n };\n }\n }\n return mergedProps;\n};\nconst isMatchingType = (type, critical) => type === critical.droppable.type;\nconst getDraggable = (critical, dimensions) => dimensions.draggables[critical.draggable.id];\nconst makeMapStateToProps = () => {\n const idleWithAnimation = {\n placeholder: null,\n shouldAnimatePlaceholder: true,\n snapshot: {\n isDraggingOver: false,\n draggingOverWith: null,\n draggingFromThisWith: null,\n isUsingPlaceholder: false\n },\n useClone: null\n };\n const idleWithoutAnimation = {\n ...idleWithAnimation,\n shouldAnimatePlaceholder: false\n };\n const getDraggableRubric = memoizeOne(descriptor => ({\n draggableId: descriptor.id,\n type: descriptor.type,\n source: {\n index: descriptor.index,\n droppableId: descriptor.droppableId\n }\n }));\n const getMapProps = memoizeOne((id, isEnabled, isDraggingOverForConsumer, isDraggingOverForImpact, dragging, renderClone) => {\n const draggableId = dragging.descriptor.id;\n const isHome = dragging.descriptor.droppableId === id;\n if (isHome) {\n const useClone = renderClone ? {\n render: renderClone,\n dragging: getDraggableRubric(dragging.descriptor)\n } : null;\n const snapshot = {\n isDraggingOver: isDraggingOverForConsumer,\n draggingOverWith: isDraggingOverForConsumer ? draggableId : null,\n draggingFromThisWith: draggableId,\n isUsingPlaceholder: true\n };\n return {\n placeholder: dragging.placeholder,\n shouldAnimatePlaceholder: false,\n snapshot,\n useClone\n };\n }\n if (!isEnabled) {\n return idleWithoutAnimation;\n }\n if (!isDraggingOverForImpact) {\n return idleWithAnimation;\n }\n const snapshot = {\n isDraggingOver: isDraggingOverForConsumer,\n draggingOverWith: draggableId,\n draggingFromThisWith: null,\n isUsingPlaceholder: true\n };\n return {\n placeholder: dragging.placeholder,\n shouldAnimatePlaceholder: true,\n snapshot,\n useClone: null\n };\n });\n const selector = (state, ownProps) => {\n const ownPropsWithDefaultProps = attachDefaultPropsToOwnProps(ownProps);\n const id = ownPropsWithDefaultProps.droppableId;\n const type = ownPropsWithDefaultProps.type;\n const isEnabled = !ownPropsWithDefaultProps.isDropDisabled;\n const renderClone = ownPropsWithDefaultProps.renderClone;\n if (isDragging(state)) {\n const critical = state.critical;\n if (!isMatchingType(type, critical)) {\n return idleWithoutAnimation;\n }\n const dragging = getDraggable(critical, state.dimensions);\n const isDraggingOver = whatIsDraggedOver(state.impact) === id;\n return getMapProps(id, isEnabled, isDraggingOver, isDraggingOver, dragging, renderClone);\n }\n if (state.phase === 'DROP_ANIMATING') {\n const completed = state.completed;\n if (!isMatchingType(type, completed.critical)) {\n return idleWithoutAnimation;\n }\n const dragging = getDraggable(completed.critical, state.dimensions);\n return getMapProps(id, isEnabled, whatIsDraggedOverFromResult(completed.result) === id, whatIsDraggedOver(completed.impact) === id, dragging, renderClone);\n }\n if (state.phase === 'IDLE' && state.completed && !state.shouldFlush) {\n const completed = state.completed;\n if (!isMatchingType(type, completed.critical)) {\n return idleWithoutAnimation;\n }\n const wasOver = whatIsDraggedOver(completed.impact) === id;\n const wasCombining = Boolean(completed.impact.at && completed.impact.at.type === 'COMBINE');\n const isHome = completed.critical.droppable.id === id;\n if (wasOver) {\n return wasCombining ? idleWithAnimation : idleWithoutAnimation;\n }\n if (isHome) {\n return idleWithAnimation;\n }\n return idleWithoutAnimation;\n }\n return idleWithoutAnimation;\n };\n return selector;\n};\nconst mapDispatchToProps = {\n updateViewportMaxScroll: updateViewportMaxScroll\n};\nconst ConnectedDroppable = connect(makeMapStateToProps, mapDispatchToProps, (stateProps, dispatchProps, ownProps) => {\n return {\n ...attachDefaultPropsToOwnProps(ownProps),\n ...stateProps,\n ...dispatchProps\n };\n}, {\n context: StoreContext,\n areStatePropsEqual: isStrictEqual\n})(Droppable);\n\nexport { DragDropContext, PublicDraggable as Draggable, ConnectedDroppable as Droppable, useKeyboardSensor, useMouseSensor, useTouchSensor };\n","\"use client\";\n\nimport {\n DragDropContext,\n Draggable,\n Droppable,\n type DropResult,\n} from \"@hello-pangea/dnd\";\nimport Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Checkbox from \"@mui/material/Checkbox\";\nimport MuiDialog from \"@mui/material/Dialog\";\nimport DialogActions from \"@mui/material/DialogActions\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport Divider from \"@mui/material/Divider\";\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useState } from \"react\";\nimport { IoClose } from \"react-icons/io5\";\nimport { cacheKeys } from \"../../api/cacheKeys\";\nimport { type Check, updateCheck } from \"../../api/checks\";\nimport { useRecceInstanceContext } from \"../../contexts\";\nimport { useApiConfig, useRun } from \"../../hooks\";\nimport { toaster } from \"../ui\";\nimport {\n CheckCard,\n type CheckCardData,\n type CheckRunStatus,\n type CheckType,\n} from \"./CheckCard\";\nimport { isDisabledByNoResult } from \"./utils\";\n\n/**\n * Wrapper component that adapts Check data to CheckCard props.\n * Handles run data fetching and maps to UI primitive expectations.\n */\nconst ChecklistItem = ({\n check,\n selected,\n onSelect,\n onApprovalChange,\n}: {\n check: Check;\n selected: boolean;\n onSelect: (checkId: string) => void;\n onApprovalChange: (checkId: string, isApproved: boolean) => void;\n}) => {\n const { featureToggles } = useRecceInstanceContext();\n const trackedRunId = check.last_run?.run_id;\n const { run } = useRun(trackedRunId);\n\n const isNoResult = isDisabledByNoResult({\n type: check.type,\n hasResult: !!run?.result,\n hasError: !!run?.error,\n });\n\n const isApprovalDisabled =\n isNoResult || featureToggles.disableUpdateChecklist;\n\n // Map run status if available\n const getRunStatus = (): CheckRunStatus | undefined => {\n if (!run) return undefined;\n if (run.error) return \"error\";\n if (run.result) return \"success\";\n return undefined;\n };\n\n // Adapt Check to CheckCardData\n const checkCardData: CheckCardData = {\n id: check.check_id,\n name: check.name,\n type: check.type as CheckType,\n isApproved: check.is_checked,\n runStatus: getRunStatus(),\n isPreset: check.is_preset,\n };\n\n return (\n <CheckCard\n check={checkCardData}\n isSelected={selected}\n onClick={onSelect}\n onApprovalChange={onApprovalChange}\n disableApproval={isApprovalDisabled}\n disabledApprovalTooltip={isNoResult ? \"Run the check first\" : undefined}\n />\n );\n};\n\nexport const CheckListOss = ({\n checks,\n selectedItem,\n onCheckSelected,\n onChecksReordered,\n}: {\n checks: Check[];\n selectedItem: string | null;\n onCheckSelected: (checkId: string) => void;\n onChecksReordered: (source: number, destination: number) => void;\n}) => {\n const [bypassModal, setBypassModal] = useState(false);\n const [open, setOpen] = useState(false);\n const [pendingApprovalCheckId, setPendingApprovalCheckId] = useState<\n string | null\n >(null);\n const queryClient = useQueryClient();\n const { apiClient } = useApiConfig();\n\n // Mutation for updating check approval status\n const { mutate: updateApproval } = useMutation({\n mutationFn: ({\n checkId,\n isChecked,\n }: {\n checkId: string;\n isChecked: boolean;\n }) => updateCheck(checkId, { is_checked: isChecked }, apiClient),\n onSuccess: async (_, { checkId }) => {\n await queryClient.invalidateQueries({\n queryKey: cacheKeys.check(checkId),\n });\n await queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });\n },\n });\n\n const onDragEnd = (result: DropResult) => {\n if (!result.destination) {\n return;\n }\n\n onChecksReordered(result.source.index, result.destination.index);\n };\n\n const handleOpen = () => setOpen(true);\n const handleClose = () => {\n setOpen(false);\n setPendingApprovalCheckId(null);\n };\n\n const showApprovedToast = () => {\n toaster.create({\n title: \"Marked as approved\",\n type: \"success\",\n duration: 2000,\n });\n };\n\n /**\n * Handle approval change from CheckCard.\n * If approving (true), show modal or bypass based on localStorage.\n * If unapproving (false), update directly.\n */\n const handleApprovalChange = (checkId: string, isApproved: boolean) => {\n if (!isApproved) {\n // Unapproving - update directly\n updateApproval({ checkId, isChecked: false });\n } else {\n // Approving - check for bypass\n const bypassMarkAsApprovedWarning = localStorage.getItem(\n \"bypassMarkAsApprovedWarning\",\n );\n if (bypassMarkAsApprovedWarning === \"true\") {\n updateApproval({ checkId, isChecked: true });\n showApprovedToast();\n } else {\n setPendingApprovalCheckId(checkId);\n handleOpen();\n }\n }\n };\n\n const handleMarkAsApprovedConfirmed = () => {\n if (pendingApprovalCheckId) {\n updateApproval({ checkId: pendingApprovalCheckId, isChecked: true });\n if (bypassModal) {\n localStorage.setItem(\"bypassMarkAsApprovedWarning\", \"true\");\n }\n showApprovedToast();\n handleClose();\n setPendingApprovalCheckId(null);\n }\n };\n\n return (\n <>\n <DragDropContext onDragEnd={onDragEnd}>\n <Droppable droppableId=\"checklist\">\n {(provided) => (\n <Stack\n {...provided.droppableProps}\n ref={provided.innerRef}\n className=\"no-track-pii-safe\"\n sx={{\n width: \"100%\",\n flex: 1,\n overflow: \"auto\",\n }}\n spacing={0}\n >\n {checks.map((check, index) => (\n <Draggable\n key={check.check_id}\n draggableId={check.check_id}\n index={index}\n >\n {(provided, snapshot) => {\n // see https://github.com/atlassian/react-beautiful-dnd/issues/1881#issuecomment-691237307\n // Create a new style object instead of mutating the read-only one\n let style = provided.draggableProps.style;\n if (snapshot.isDragging && style && \"left\" in style) {\n const offset = { x: 0, y: 80 };\n style = {\n ...style,\n left: (style.left as number) - offset.x,\n top: (style.top as number) - offset.y,\n };\n }\n\n return (\n <Box\n ref={provided.innerRef}\n {...provided.draggableProps}\n {...provided.dragHandleProps}\n style={style}\n sx={{ width: \"100%\" }}\n borderBottom=\"1px solid\"\n borderColor=\"divider\"\n >\n <ChecklistItem\n key={check.check_id}\n check={check}\n selected={check.check_id === selectedItem}\n onSelect={onCheckSelected}\n onApprovalChange={handleApprovalChange}\n />\n </Box>\n );\n }}\n </Draggable>\n ))}\n {provided.placeholder}\n </Stack>\n )}\n </Droppable>\n </DragDropContext>\n <MuiDialog open={open} onClose={handleClose} maxWidth=\"xs\" fullWidth>\n <DialogTitle sx={{ display: \"flex\", alignItems: \"center\" }}>\n Mark as Approved?\n <Box sx={{ flexGrow: 1 }} />\n <IconButton size=\"small\" onClick={handleClose}>\n <IoClose />\n </IconButton>\n </DialogTitle>\n <Divider />\n <DialogContent sx={{ fontSize: \"0.875rem\" }}>\n <Typography>\n Please ensure you have reviewed the contents of this check before\n marking it as approved.\n </Typography>\n <FormControlLabel\n control={\n <Checkbox\n checked={bypassModal}\n onChange={(e) => {\n setBypassModal(e.target.checked);\n }}\n size=\"small\"\n />\n }\n label={\n <Typography sx={{ fontWeight: \"bold\", pt: \"8px\" }}>\n Don&apos;t show this again\n </Typography>\n }\n />\n </DialogContent>\n <Divider />\n <DialogActions sx={{ gap: 0 }}>\n <Button variant=\"outlined\" size=\"small\" onClick={handleClose}>\n Cancel\n </Button>\n <Button\n color=\"iochmara\"\n variant=\"contained\"\n size=\"small\"\n onClick={handleMarkAsApprovedConfirmed}\n >\n Mark as approved\n </Button>\n </DialogActions>\n </MuiDialog>\n </>\n );\n};\n","\"use client\";\n\nimport Box from \"@mui/material/Box\";\nimport Divider from \"@mui/material/Divider\";\nimport Stack from \"@mui/material/Stack\";\nimport { useTheme } from \"@mui/material/styles\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useRouter, useSearchParams } from \"next/navigation\";\nimport React, {\n ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { cacheKeys, listChecks, reorderChecks } from \"../../api\";\nimport { useRouteConfig } from \"../../contexts\";\nimport { useApiConfig, useRecceCheckContext } from \"../../hooks\";\nimport { StateImporter } from \"../app\";\nimport { HSplit } from \"../ui\";\nimport { CheckDetailOss as CheckDetail } from \"./CheckDetailOss\";\nimport { CheckEmptyStateOss as CheckEmptyState } from \"./CheckEmptyStateOss\";\nimport { CheckListOss as CheckList } from \"./CheckListOss\";\n\nexport const CheckPageContentOss = (): ReactNode => {\n const theme = useTheme();\n const isDark = theme.palette.mode === \"dark\";\n const borderColor = isDark ? \"grey.700\" : \"grey.300\";\n const router = useRouter();\n const searchParams = useSearchParams();\n const checkId = searchParams.get(\"id\");\n const { latestSelectedCheckId, setLatestSelectedCheckId } =\n useRecceCheckContext();\n const queryClient = useQueryClient();\n const { apiClient } = useApiConfig();\n const { basePath } = useRouteConfig();\n const selectedItem = checkId;\n\n useEffect(() => {\n if (selectedItem) {\n setLatestSelectedCheckId(selectedItem);\n }\n }, [selectedItem, setLatestSelectedCheckId]);\n\n const {\n isLoading,\n error,\n data: checks,\n status,\n refetch: refetchCheckList,\n } = useQuery({\n queryKey: cacheKeys.checks(),\n queryFn: () => listChecks(apiClient),\n refetchOnMount: true,\n });\n\n const handleSelectItem = useCallback(\n (checkId: string) => {\n router.push(`${basePath}/checks/?id=${checkId}`);\n },\n [router.push, basePath],\n );\n\n const [orderedChecks, setOrderedChecks] = useState(checks ?? []);\n const [prevChecks, setPrevChecks] = useState(checks);\n\n // Sync orderedChecks with checks when checks data changes (during render)\n if (checks !== prevChecks) {\n setPrevChecks(checks);\n setOrderedChecks(checks ?? []);\n }\n\n const { mutate: changeChecksOrder } = useMutation({\n mutationFn: (order: { source: number; destination: number }) =>\n reorderChecks(order, apiClient),\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });\n },\n });\n\n const handleDragEnd = useCallback(\n (source: number, destination: number) => {\n const updatedItems = [...orderedChecks];\n const [reorderedItem] = updatedItems.splice(source, 1);\n updatedItems.splice(destination, 0, reorderedItem);\n\n changeChecksOrder({\n source,\n destination,\n });\n\n setOrderedChecks(updatedItems);\n },\n [orderedChecks, changeChecksOrder],\n );\n\n // Memoized validation to avoid duplicate checks.some() calls\n const isValidSelection = useMemo(\n () =>\n Boolean(\n selectedItem &&\n checks?.some((check) => check.check_id === selectedItem),\n ),\n [selectedItem, checks],\n );\n\n useEffect(() => {\n if (status !== \"success\" || checks.length === 0) {\n return;\n }\n\n if (!isValidSelection) {\n // No selection or invalid selection - redirect to a valid check\n // First try latestSelectedCheckId if it's valid\n const isValidLatestSelectedCheckId =\n latestSelectedCheckId &&\n checks.some((check) => check.check_id === latestSelectedCheckId);\n\n if (isValidLatestSelectedCheckId) {\n router.replace(`${basePath}/checks/?id=${latestSelectedCheckId}`);\n } else {\n // Fall back to the first check\n router.replace(`${basePath}/checks/?id=${checks[0].check_id}`);\n }\n }\n }, [\n status,\n isValidSelection,\n checks,\n latestSelectedCheckId, // Fall back to the first check\n router.replace,\n basePath,\n ]);\n\n if (isLoading) {\n return null;\n }\n\n if (error) {\n return (\n <Box>\n Error: <span className=\"no-track-pii-safe\">{error.message}</span>\n </Box>\n );\n }\n\n if (!checks?.length) {\n return (\n <HSplit style={{ height: \"100%\" }} minSize={50} sizes={[20, 80]}>\n <Box\n sx={{\n borderRight: \"1px solid\",\n borderRightColor: borderColor,\n height: \"100%\",\n }}\n style={{ contain: \"size\" }}\n >\n <Stack\n sx={{ height: \"100%\", alignItems: \"stretch\" }}\n style={{ contain: \"strict\" }}\n spacing={0}\n >\n <Box\n sx={{\n display: \"flex\",\n justifyContent: \"flex-end\",\n p: \"0px 10px\",\n }}\n >\n <StateImporter checksOnly />\n </Box>\n <Divider />\n <Box\n sx={{\n height: \"100%\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <Box sx={{ textAlign: \"center\", color: \"grey.500\" }}>\n No checks\n </Box>\n </Box>\n </Stack>\n </Box>\n <Box>\n <Box\n sx={{\n height: \"100%\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <CheckEmptyState />\n </Box>\n </Box>\n </HSplit>\n );\n }\n\n return (\n <HSplit style={{ height: \"100%\" }} minSize={50} sizes={[20, 80]}>\n <Box sx={{ height: \"100%\" }} style={{ contain: \"size\" }}>\n <Stack\n sx={{ height: \"100%\", alignItems: \"stretch\" }}\n style={{ contain: \"strict\" }}\n spacing={0}\n >\n <Box\n sx={{ display: \"flex\", justifyContent: \"flex-end\", p: \"0px 10px\" }}\n >\n <StateImporter checksOnly />\n </Box>\n <Divider />\n <CheckList\n checks={orderedChecks}\n selectedItem={selectedItem}\n onCheckSelected={handleSelectItem}\n onChecksReordered={handleDragEnd}\n />\n </Stack>\n </Box>\n <Box sx={{ height: \"100%\" }}>\n {/* isValidSelection already checks selectedItem, but TS needs explicit check for type narrowing */}\n {isValidSelection && selectedItem && (\n <CheckDetail\n key={selectedItem}\n checkId={selectedItem}\n refreshCheckList={refetchCheckList}\n />\n )}\n </Box>\n </HSplit>\n );\n};\n","\"use client\";\n\nimport Box from \"@mui/material/Box\";\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport { useTheme } from \"@mui/material/styles\";\nimport React, { ReactNode } from \"react\";\nimport { HSplit } from \"../ui\";\n\n/**\n * Loading fallback - shows minimal UI while search params are being read\n */\nexport const CheckPageLoadingOss = (): ReactNode => {\n const theme = useTheme();\n const isDark = theme.palette.mode === \"dark\";\n const borderColor = isDark ? \"grey.700\" : \"grey.300\";\n\n return (\n <HSplit style={{ height: \"100%\" }} minSize={50} sizes={[20, 80]}>\n <Box\n sx={{\n borderRight: \"1px solid\",\n borderRightColor: borderColor,\n height: \"100%\",\n }}\n style={{ contain: \"size\" }}\n >\n <Box\n sx={{\n height: \"100%\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <CircularProgress size={20} />\n </Box>\n </Box>\n <Box>\n <Box\n sx={{\n height: \"100%\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <CircularProgress size={20} />\n </Box>\n </Box>\n </HSplit>\n );\n};\n","/**\n * @file types.ts\n * @description Type definitions for change summary components\n *\n * These types define the various change statuses that can occur in a\n * lineage graph, including node-level changes (added, removed, modified)\n * and column-level changes.\n */\n\nimport type { LineageGraph } from \"../../types\";\n\n/**\n * Change status for nodes and columns in a lineage graph\n *\n * Node changes:\n * - added: New resource added to the graph\n * - removed: Resource removed from the graph\n * - modified: Resource code was modified\n *\n * Column changes:\n * - col_added: New column added to a node\n * - col_removed: Column removed from a node\n * - col_changed: Column type or definition changed\n *\n * Folder changes:\n * - folder_changed: Files in a folder were modified\n *\n * null: No change detected\n */\nexport type ChangeStatus =\n // node change (code change - user edit)\n | \"added\"\n | \"removed\"\n | \"modified\"\n // column change\n | \"col_added\"\n | \"col_removed\"\n | \"col_changed\"\n // folder change\n | \"folder_changed\"\n | null;\n\n/**\n * Labels for each change status\n * Format: [shortLabel, longLabel]\n */\nexport const NODE_CHANGE_STATUS_MSGS: Record<\n NonNullable<ChangeStatus>,\n [string, string]\n> = {\n added: [\"Model Added\", \"Added resource\"],\n removed: [\"Model Removed\", \"Removed resource\"],\n modified: [\"Model Modified\", \"Modified resource\"],\n col_added: [\"Column Added\", \"Added column\"],\n col_removed: [\"Column Removed\", \"Removed column\"],\n col_changed: [\"Column Modified\", \"Modified column\"],\n folder_changed: [\"Modified\", \"Modified folder\"],\n};\n\n/**\n * Props for the ChangeSummary component\n */\nexport interface ChangeSummaryProps {\n lineageGraph: LineageGraph;\n}\n\n/**\n * Result of calculating column changes between base and current\n */\nexport interface ColumnChangeResult {\n adds: number;\n removes: number;\n modifies: number;\n}\n\n/**\n * Result of calculating all changes in a lineage graph\n */\nexport interface ChangeSummaryResult {\n adds: number;\n removes: number;\n modifies: number;\n col_added: number;\n col_removed: number;\n col_changed: number;\n}\n","/**\n * @file utils.ts\n * @description Utility functions for change summary calculations\n *\n * These functions calculate change statistics across a lineage graph,\n * including node-level and column-level changes.\n */\n\nimport type { NodeData } from \"../../api/info\";\nimport { token } from \"../../theme/colors\";\nimport type { LineageGraph } from \"../../types\";\nimport {\n IconAdded,\n IconChanged,\n type IconComponent,\n IconModified,\n IconRemoved,\n} from \"../lineage/styles\";\nimport type {\n ChangeStatus,\n ChangeSummaryResult,\n ColumnChangeResult,\n} from \"./types\";\n\n/**\n * Get icon and color for a given change status\n *\n * Maps change statuses to visual indicators (icons and colors) for\n * consistent display across the UI.\n *\n * @param changeStatus - The change status to get icon for\n * @returns Object with color and icon component\n */\nexport function getIconForChangeStatus(changeStatus?: ChangeStatus): {\n color: string;\n icon: IconComponent | undefined;\n} {\n const greenColor = String(token(\"colors.green.solid\"));\n const redColor = String(token(\"colors.red.solid\"));\n const amberColor = String(token(\"colors.amber.emphasized\"));\n\n if (changeStatus === \"added\") {\n return { color: greenColor, icon: IconAdded };\n } else if (changeStatus === \"removed\") {\n return { color: redColor, icon: IconRemoved };\n } else if (changeStatus === \"modified\") {\n return { color: amberColor, icon: IconModified };\n } else if (changeStatus === \"col_added\") {\n return { color: greenColor, icon: IconAdded };\n } else if (changeStatus === \"col_removed\") {\n return { color: redColor, icon: IconRemoved };\n } else if (changeStatus === \"col_changed\") {\n return { color: amberColor, icon: IconModified };\n } else if (changeStatus === \"folder_changed\") {\n return { color: amberColor, icon: IconChanged };\n }\n\n return { color: \"inherit\", icon: undefined };\n}\n\n/**\n * Calculate column changes between base and current node data\n *\n * Compares the columns in base and current versions of a node to\n * determine how many columns were added, removed, or modified.\n *\n * @param base - Base version node data\n * @param current - Current version node data\n * @returns Column change counts\n */\nexport function calculateColumnChange(\n base: NodeData | undefined,\n current: NodeData | undefined,\n): ColumnChangeResult {\n let adds = 0;\n let removes = 0;\n let modifies = 0;\n if (!base && !current) return { adds, removes, modifies };\n\n // Add columns\n if (current) {\n Object.keys(current.columns ?? {}).forEach((col) => {\n if (!base?.columns?.[col]) adds++;\n });\n }\n\n // Remove columns\n if (base) {\n Object.keys(base.columns ?? {}).forEach((col) => {\n if (!current?.columns?.[col]) removes++;\n });\n }\n\n // Modify columns\n if (current && base) {\n Object.keys(current.columns ?? {}).forEach((col) => {\n if (base.columns && current.columns?.[col] && base.columns[col]) {\n if (base.columns[col].type !== current.columns[col].type) modifies++;\n }\n });\n }\n\n return { adds, removes, modifies };\n}\n\n/**\n * Calculate all changes in a lineage graph\n *\n * Iterates through all modified nodes in the lineage graph and\n * aggregates node-level and column-level changes.\n *\n * @param lineageGraph - The lineage graph to analyze\n * @returns Aggregated change counts\n */\nexport function calculateChangeSummary(\n lineageGraph: LineageGraph,\n): ChangeSummaryResult {\n const modifiedSet = lineageGraph.modifiedSet;\n let adds = 0;\n let removes = 0;\n let modifies = 0;\n let col_added = 0;\n let col_removed = 0;\n let col_changed = 0;\n\n modifiedSet.forEach((nodeId) => {\n if (lineageGraph.nodes[nodeId].data.changeStatus === \"added\") adds++;\n else if (lineageGraph.nodes[nodeId].data.changeStatus === \"removed\")\n removes++;\n else if (lineageGraph.nodes[nodeId].data.changeStatus === \"modified\")\n modifies++;\n\n const base = lineageGraph.nodes[nodeId].data.data.base;\n const current = lineageGraph.nodes[nodeId].data.data.current;\n const columnChange = calculateColumnChange(base, current);\n col_added += columnChange.adds;\n col_removed += columnChange.removes;\n col_changed += columnChange.modifies;\n });\n\n return { adds, removes, modifies, col_added, col_removed, col_changed };\n}\n","/**\n * @file ChangeSummary.tsx\n * @description Change summary component for displaying node and column changes\n *\n * This component displays an overview of changes detected in a lineage graph,\n * including:\n * - Code changes (added, removed, modified nodes)\n * - Column changes (added, removed, modified columns)\n *\n * Each change type is displayed with its corresponding icon and count.\n */\n\nimport Box from \"@mui/material/Box\";\nimport Grid from \"@mui/material/Grid\";\nimport Stack from \"@mui/material/Stack\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport type { ReactNode } from \"react\";\nimport { FiInfo } from \"react-icons/fi\";\n\nimport type { ChangeStatus, ChangeSummaryProps } from \"./types\";\nimport { NODE_CHANGE_STATUS_MSGS } from \"./types\";\nimport { calculateChangeSummary, getIconForChangeStatus } from \"./utils\";\n\n/**\n * Summary text display with optional tooltip\n *\n * @internal\n */\nfunction SummaryText({\n name,\n value,\n tip,\n}: {\n name: ReactNode;\n value: ReactNode;\n tip?: ReactNode;\n}) {\n return (\n <Stack alignItems=\"stretch\">\n <Typography sx={{ fontSize: \"0.875rem\", color: \"grey.600\" }}>\n {name}\n {tip && (\n <MuiTooltip title={tip}>\n <Box sx={{ display: \"inline-block\" }}>\n <Box\n component={FiInfo}\n sx={{ mx: \"2px\", fontSize: 12, verticalAlign: \"middle\" }}\n />\n </Box>\n </MuiTooltip>\n )}\n </Typography>\n {value}\n </Stack>\n );\n}\n\n/**\n * Label for a change status count with icon\n *\n * @internal\n */\nfunction ChangeStatusCountLabel({\n changeStatus,\n value,\n}: {\n changeStatus: ChangeStatus;\n value: number;\n}) {\n const [label] = changeStatus ? NODE_CHANGE_STATUS_MSGS[changeStatus] : [\"\"];\n const { icon, color } = getIconForChangeStatus(changeStatus);\n\n return (\n <Stack alignItems=\"stretch\">\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n sx={{ fontSize: \"0.875rem\", color: \"grey.600\" }}\n >\n {icon && (\n <Box component={icon} sx={{ mr: \"5px\", color, fontSize: \"1rem\" }} />\n )}\n {label}\n </Stack>\n <Typography sx={{ fontSize: \"0.875rem\" }}>{value}</Typography>\n </Stack>\n );\n}\n\n/**\n * ChangeSummary component\n *\n * Displays a summary of all changes in a lineage graph, split into two sections:\n * - Code Changes: Added, removed, and modified nodes\n * - Column Changes: Added, removed, and modified columns\n *\n * @example\n * ```tsx\n * <ChangeSummary lineageGraph={lineageGraph} />\n * ```\n */\nexport function ChangeSummary({ lineageGraph }: ChangeSummaryProps) {\n const { adds, removes, modifies, col_added, col_removed, col_changed } =\n calculateChangeSummary(lineageGraph);\n\n return (\n <Grid\n container\n sx={{\n mb: \"10px\",\n borderTop: \"1px solid\",\n borderColor: \"divider\",\n p: \"2.5vw\",\n }}\n >\n <Grid size={6} sx={{ borderColor: \"divider\" }}>\n <SummaryText\n name=\"Code Changes\"\n value={\n <Grid container sx={{ width: \"100%\" }}>\n <Grid size={4}>\n <ChangeStatusCountLabel changeStatus=\"added\" value={adds} />\n </Grid>\n <Grid size={4}>\n <ChangeStatusCountLabel\n changeStatus=\"removed\"\n value={removes}\n />\n </Grid>\n <Grid size={4}>\n <ChangeStatusCountLabel\n changeStatus=\"modified\"\n value={modifies}\n />\n </Grid>\n </Grid>\n }\n />\n </Grid>\n <Grid\n size={6}\n sx={{ borderLeft: \"1px solid\", borderLeftColor: \"divider\", pl: \"12px\" }}\n >\n <SummaryText\n name=\"Column Changes\"\n value={\n <Grid container sx={{ width: \"100%\" }}>\n <Grid size={4}>\n <ChangeStatusCountLabel\n changeStatus=\"col_added\"\n value={col_added}\n />\n </Grid>\n <Grid size={4}>\n <ChangeStatusCountLabel\n changeStatus=\"col_removed\"\n value={col_removed}\n />\n </Grid>\n <Grid size={4}>\n <ChangeStatusCountLabel\n changeStatus=\"col_changed\"\n value={col_changed}\n />\n </Grid>\n </Grid>\n }\n />\n </Grid>\n </Grid>\n );\n}\n","\"use client\";\n\nimport Box from \"@mui/material/Box\";\nimport Card from \"@mui/material/Card\";\nimport CardContent from \"@mui/material/CardContent\";\nimport CardHeader from \"@mui/material/CardHeader\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { useEffect, useState } from \"react\";\nimport type { LineageGraph, LineageGraphNode } from \"../../contexts\";\nimport { mergeKeysWithStatus } from \"../../utils\";\nimport { ResourceTypeTag, RowCountDiffTag } from \"../lineage\";\nimport { SchemaView } from \"../schema\";\n\ninterface SchemaDiffCardProps {\n title: string;\n node: LineageGraphNode;\n}\n\nfunction SchemaDiffCard({ node, ...props }: SchemaDiffCardProps) {\n return (\n <Card sx={{ maxWidth: 500 }}>\n <CardHeader\n title={\n <Typography sx={{ fontSize: 18, fontWeight: \"bold\" }}>\n {props.title}\n </Typography>\n }\n subheader={\n <Stack direction=\"row\" spacing=\"8px\" sx={{ p: \"16px\" }}>\n <ResourceTypeTag data={{ resourceType: node.data.resourceType }} />\n {node.data.resourceType === \"model\" && (\n <RowCountDiffTag node={node} />\n )}\n </Stack>\n }\n />\n <CardContent>\n <Box sx={{ display: \"flex\" }}>\n <SchemaView\n base={node.data.data.base}\n current={node.data.data.current}\n />\n </Box>\n </CardContent>\n </Card>\n );\n}\n\nfunction listChangedNodes(lineageGraph: LineageGraph) {\n const changedNodes: LineageGraphNode[] = [];\n const allNodes = lineageGraph.nodes;\n lineageGraph.modifiedSet.forEach((nodeId) => {\n const node = allNodes[nodeId];\n const columnDiffStatus = mergeKeysWithStatus(\n Object.keys(node.data.data.base?.columns ?? {}),\n Object.keys(node.data.data.current?.columns ?? {}),\n );\n const isSchemaChanged = !Object.values(columnDiffStatus).every(\n (el) => el === undefined,\n );\n // We only want to show nodes that have real schema changes.\n // It doesn't include added or deleted model.\n if (isSchemaChanged && node.data.data.base && node.data.data.current)\n changedNodes.push(node);\n });\n return changedNodes;\n}\n\nexport interface SchemaSummaryProps {\n lineageGraph: LineageGraph;\n}\n\nexport function SchemaSummary({ lineageGraph }: SchemaSummaryProps) {\n const [changedNodes, setChangedNodes] = useState<LineageGraphNode[]>([]);\n\n useEffect(() => {\n setChangedNodes(listChangedNodes(lineageGraph));\n }, [lineageGraph]);\n\n return (\n <>\n <Box\n sx={{\n width: \"100%\",\n pb: \"10px\",\n mb: \"20px\",\n mt: \"20px\",\n }}\n >\n <Typography variant=\"h5\" sx={{ fontSize: 24 }}>\n Schema Summary\n </Typography>\n </Box>\n <Box sx={{ width: \"100%\", pb: \"10px\", mb: \"20px\" }}>\n {changedNodes.length === 0 ? (\n <Typography sx={{ fontSize: 18, color: \"grey.600\" }}>\n No schema changes detected.\n </Typography>\n ) : (\n <Box\n sx={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(400px, 1fr))\",\n gap: \"2vw\",\n p: \"2.5vw\",\n width: \"100%\",\n bgcolor: \"lightgray\",\n }}\n >\n {changedNodes.map((node) => {\n return (\n <SchemaDiffCard\n key={node.id}\n title={node.data.name}\n node={node}\n />\n );\n })}\n </Box>\n )}\n </Box>\n </>\n );\n}\n","\"use client\";\n\nimport Box from \"@mui/material/Box\";\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport Typography from \"@mui/material/Typography\";\nimport { memo, useCallback, useMemo } from \"react\";\nimport type { Check } from \"../../providers/contexts/CheckContext\";\nimport { useCheckContext } from \"../../providers/contexts/CheckContext\";\nimport type { CheckAction, CheckActionType } from \"../check/CheckActions\";\nimport type { CheckCardData } from \"../check/CheckCard\";\nimport {\n CheckDetail,\n type CheckDetailProps,\n type CheckDetailTab,\n} from \"../check/CheckDetail\";\nimport { CheckEmptyState } from \"../check/CheckEmptyState\";\nimport { CheckList } from \"../check/CheckList\";\nimport { SplitPane } from \"../ui/SplitPane\";\n\n/**\n * Props for the ChecksView component.\n * Defines options for viewing and managing checks.\n */\nexport interface ChecksViewProps {\n /**\n * Optional checks data. If not provided, uses CheckContext.\n */\n checks?: Check[];\n\n /**\n * Loading state. If not provided, uses CheckContext.\n */\n isLoading?: boolean;\n\n /**\n * Error message. If not provided, uses CheckContext.\n */\n error?: string;\n\n /**\n * Currently selected check ID. If not provided, uses CheckContext.\n */\n selectedCheckId?: string;\n\n /**\n * Callback when a check is selected. If not provided, uses CheckContext.\n */\n onCheckSelect?: (checkId: string) => void;\n\n /**\n * Callback when check approval status changes.\n */\n onApprovalChange?: (checkId: string, isApproved: boolean) => void;\n\n /**\n * Callback when a check action is triggered.\n */\n onAction?: (checkId: string, actionType: CheckActionType) => void;\n\n /**\n * Callback when checks are reordered.\n */\n onReorder?: (sourceIndex: number, destinationIndex: number) => void;\n\n /**\n * Callback when description changes.\n */\n onDescriptionChange?: (checkId: string, description?: string) => void;\n\n /**\n * Callback when name changes.\n */\n onNameChange?: (checkId: string, name: string) => void;\n\n /**\n * Callback when create is clicked (in empty state).\n */\n onCreateCheck?: () => void;\n\n /**\n * Function to generate tabs for a check detail view.\n */\n getCheckTabs?: (check: Check) => CheckDetailTab[];\n\n /**\n * Function to generate primary actions for a check.\n */\n getPrimaryActions?: (check: Check) => CheckAction[];\n\n /**\n * Function to generate secondary actions for a check.\n */\n getSecondaryActions?: (check: Check) => CheckAction[];\n\n /**\n * Whether approval is disabled for all checks.\n */\n disableApproval?: boolean;\n\n /**\n * Tooltip for disabled approval.\n */\n disabledApprovalTooltip?: string;\n\n /**\n * Optional height for the view.\n * @default \"100%\"\n */\n height?: number | string;\n\n /**\n * Initial split pane size (percentage for list).\n * @default 30\n */\n listPaneSize?: number;\n\n /**\n * Minimum list pane size in pixels.\n * @default 200\n */\n minListSize?: number;\n\n /**\n * Maximum list pane size in pixels.\n * @default 500\n */\n maxListSize?: number;\n\n /**\n * Title for the check list.\n */\n listTitle?: string;\n\n /**\n * Optional CSS class name.\n */\n className?: string;\n}\n\n/**\n * ChecksView Component\n *\n * A high-level component for viewing and managing checks using a\n * split-pane layout with a list on the left and details on the right.\n *\n * Can receive data from:\n * 1. CheckContext (wrap with CheckProvider)\n * 2. Direct props (pass checks, selectedCheckId, etc.)\n *\n * @example Using with context\n * ```tsx\n * import { CheckProvider, ChecksView } from '@datarecce/ui';\n *\n * function App() {\n * const { checks, isLoading } = useChecksQuery();\n * const [selectedId, setSelectedId] = useState<string>();\n *\n * return (\n * <CheckProvider\n * checks={checks}\n * isLoading={isLoading}\n * selectedCheckId={selectedId}\n * onSelectCheck={setSelectedId}\n * >\n * <ChecksView\n * getCheckTabs={(check) => [\n * { id: 'result', label: 'Result', content: <ResultView check={check} /> },\n * ]}\n * />\n * </CheckProvider>\n * );\n * }\n * ```\n *\n * @example Using with direct props\n * ```tsx\n * import { ChecksView } from '@datarecce/ui';\n *\n * function App({ checks, selectedId, onSelect }) {\n * return (\n * <ChecksView\n * checks={checks}\n * selectedCheckId={selectedId}\n * onCheckSelect={onSelect}\n * onApprovalChange={(id, approved) => updateCheck(id, { is_checked: approved })}\n * />\n * );\n * }\n * ```\n */\nfunction ChecksViewComponent({\n checks: propChecks,\n isLoading: propIsLoading,\n error: propError,\n selectedCheckId: propSelectedCheckId,\n onCheckSelect: propOnCheckSelect,\n onApprovalChange,\n onAction,\n onReorder,\n onDescriptionChange,\n onNameChange,\n onCreateCheck,\n getCheckTabs,\n getPrimaryActions,\n getSecondaryActions,\n disableApproval = false,\n disabledApprovalTooltip,\n height = \"100%\",\n listPaneSize = 30,\n minListSize = 200,\n maxListSize = 500,\n listTitle,\n className,\n}: ChecksViewProps) {\n // Get data from context or props\n const contextValue = useCheckContext();\n\n const checks = propChecks ?? contextValue.checks;\n const isLoading =\n propIsLoading !== undefined ? propIsLoading : contextValue.isLoading;\n const error = propError ?? contextValue.error;\n const selectedCheckId = propSelectedCheckId ?? contextValue.selectedCheckId;\n const onSelectCheck = propOnCheckSelect ?? contextValue.onSelectCheck;\n\n // Convert Check to CheckCardData\n const checkCards = useMemo<CheckCardData[]>(\n () =>\n checks.map((check) => ({\n id: check.check_id,\n name: check.name,\n type: check.type as CheckCardData[\"type\"],\n description: check.description,\n isApproved: check.is_checked,\n })),\n [checks],\n );\n\n // Find selected check\n const selectedCheck = useMemo(\n () => checks.find((c) => c.check_id === selectedCheckId),\n [checks, selectedCheckId],\n );\n\n // Handle check selection\n const handleCheckSelect = useCallback(\n (checkId: string) => {\n onSelectCheck?.(checkId);\n },\n [onSelectCheck],\n );\n\n // Handle action\n const handleAction = useCallback(\n (checkId: string, actionType: CheckActionType) => {\n onAction?.(checkId, actionType);\n },\n [onAction],\n );\n\n // Handle description change\n const handleDescriptionChange = useCallback(\n (description?: string) => {\n if (selectedCheckId) {\n onDescriptionChange?.(selectedCheckId, description);\n }\n },\n [selectedCheckId, onDescriptionChange],\n );\n\n // Handle name change\n const handleNameChange = useCallback(\n (name: string) => {\n if (selectedCheckId) {\n onNameChange?.(selectedCheckId, name);\n }\n },\n [selectedCheckId, onNameChange],\n );\n\n // Loading state\n if (isLoading) {\n return (\n <Box\n className={className}\n sx={{\n width: \"100%\",\n height,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <CircularProgress />\n </Box>\n );\n }\n\n // Error state\n if (error) {\n return (\n <Box\n className={className}\n sx={{\n width: \"100%\",\n height,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <Typography color=\"error\">{error}</Typography>\n </Box>\n );\n }\n\n // Empty state\n if (checks.length === 0) {\n return (\n <Box\n className={className}\n sx={{\n width: \"100%\",\n height,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <CheckEmptyState\n title=\"No checks yet\"\n description=\"Create your first check to start validating your data.\"\n actionText=\"Create Check\"\n onAction={onCreateCheck}\n />\n </Box>\n );\n }\n\n // Build detail props\n const detailTabs = selectedCheck ? getCheckTabs?.(selectedCheck) : undefined;\n const primaryActions = selectedCheck\n ? getPrimaryActions?.(selectedCheck)\n : undefined;\n const secondaryActions = selectedCheck\n ? getSecondaryActions?.(selectedCheck)\n : undefined;\n\n return (\n <Box className={className} sx={{ width: \"100%\", height }}>\n <SplitPane\n direction=\"horizontal\"\n sizes={[listPaneSize, 100 - listPaneSize]}\n minSizes={[minListSize, 200]}\n maxSizes={[maxListSize, Infinity]}\n >\n {/* Left pane: Check list */}\n <Box sx={{ height: \"100%\", overflow: \"auto\" }}>\n <CheckList\n checks={checkCards}\n selectedId={selectedCheckId}\n onCheckSelect={handleCheckSelect}\n onApprovalChange={onApprovalChange}\n onReorder={onReorder}\n disableApproval={disableApproval}\n disabledApprovalTooltip={disabledApprovalTooltip}\n title={listTitle}\n />\n </Box>\n\n {/* Right pane: Check detail */}\n <Box sx={{ height: \"100%\", overflow: \"auto\" }}>\n {selectedCheck ? (\n <CheckDetail\n checkId={selectedCheck.check_id}\n name={selectedCheck.name}\n type={selectedCheck.type}\n description={selectedCheck.description}\n isApproved={selectedCheck.is_checked}\n tabs={detailTabs}\n primaryActions={primaryActions}\n secondaryActions={secondaryActions}\n onAction={handleAction}\n onDescriptionChange={handleDescriptionChange}\n onNameChange={handleNameChange}\n />\n ) : (\n <Box\n sx={{\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <Typography color=\"text.secondary\">\n Select a check from the list to view details\n </Typography>\n </Box>\n )}\n </Box>\n </SplitPane>\n </Box>\n );\n}\n\n/**\n * Memoized ChecksView component for performance optimization.\n */\nexport const ChecksView = memo(ChecksViewComponent);\nChecksView.displayName = \"ChecksView\";\n","// @datarecce/ui - React component library for data validation interfaces\n\n// Version\nexport const VERSION = \"0.2.0\";\n\n// API utilities\nexport type {\n CatalogMetadata,\n GitInfo,\n LineageData,\n LineageDataFromMetadata,\n LineageDiffData,\n ManifestMetadata,\n ModelInfoResult,\n NodeColumnData,\n NodeData,\n PullRequestInfo,\n RecceInstanceInfo,\n RecceServerFlags,\n RunsAggregated,\n ServerInfoResult,\n ServerMode,\n SQLMeshInfo,\n StateMetadata,\n} from \"./api\";\nexport {\n aggregateRuns,\n cacheKeys,\n getLastKeepAliveTime,\n getModelInfo,\n getRecceInstanceInfo,\n getServerFlag,\n getServerInfo,\n markRelaunchHintCompleted,\n reorderChecks,\n resetKeepAliveState,\n sendKeepAlive,\n setKeepAliveCallback,\n useChecks,\n} from \"./api\";\n\n// Components - UI components for data validation interfaces\n// NOTE: LineageCanvasProps canonical in @datarecce/ui/types\nexport type {\n // High-level views (Layer 3)\n ChecksViewProps,\n // UI primitives\n DiffTextProps,\n // Lineage\n LineageCanvasProps,\n LineageViewProps,\n LineageViewRef,\n SplitProps,\n SquareIconProps,\n} from \"./components\";\nexport {\n // High-level views (Layer 3)\n ChecksView,\n // UI primitives\n DiffText,\n HSplit,\n // Lineage\n LineageCanvas,\n LineageView,\n SquareIcon,\n VSplit,\n} from \"./components\";\n\n// Result view factory and types\n// NOTE: canonical in @datarecce/ui/result\nexport type {\n CreatedResultViewProps,\n ResultViewConfig,\n ResultViewData,\n ResultViewProps,\n ResultViewRef,\n ResultViewTransformOptions,\n ScreenshotWrapperType,\n} from \"./components/result\";\nexport { createResultView } from \"./components/result\";\n// Constants - reusable constant values for UI components\nexport {\n type DisableTooltipMessageKey,\n DisableTooltipMessages,\n} from \"./constants\";\n// Contexts - React contexts for state management\n// NOTE: Context hooks canonical in @datarecce/ui/contexts\n// NOTE: Types canonical in @datarecce/ui/types\nexport type {\n // LineageViewContext types\n ActionMode,\n ActionState,\n // Action context\n AxiosQueryParams,\n // Lineage graph types (canonical: @datarecce/ui/types)\n EnvInfo,\n IdleTimeoutContextType,\n InstanceInfoType,\n LineageGraph,\n LineageGraphColumnNode,\n LineageGraphContextType,\n LineageGraphEdge,\n LineageGraphNode,\n LineageGraphNodes,\n LineageGraphProviderProps,\n LineageViewContextType,\n NodeAction,\n NodeColumnSetMap,\n RecceActionContextType,\n RecceActionOptions,\n RecceActionProviderProps,\n RecceFeatureMode,\n RecceFeatureToggles,\n SelectMode,\n SubmitRunTrackProps,\n} from \"./contexts\";\nexport {\n // Lineage graph utilities (canonical: @datarecce/ui/contexts)\n buildLineageGraph,\n COLUMN_HEIGHT,\n // Instance info\n defaultFeatureToggles,\n defaultInstanceInfo,\n getNeighborSet,\n // Idle timeout\n IdleTimeoutProvider,\n intersect,\n isLineageGraphColumnNode,\n isLineageGraphNode,\n // Lineage graph\n LineageGraphProvider,\n layoutWithDagre,\n // Action context\n RecceActionProvider,\n RecceInstanceInfoProvider,\n selectDownstream,\n selectUpstream,\n toReactFlowBasic,\n union,\n useIdleDetection,\n useIdleTimeout,\n useIdleTimeoutSafe,\n useLineageGraphContext,\n useRecceActionContext,\n useRecceInstanceContext,\n useRecceInstanceInfo,\n useRecceServerFlag,\n useRunsAggregated,\n} from \"./contexts\";\n// Hooks - utility hooks for theming and data\nexport type {\n MultiNodesActionCallbacks,\n MultiNodesActionTracking,\n MultiNodesActionTrackProps,\n MultiNodesActionType,\n OSSCheckContext,\n OSSQueryContext,\n RecceActionOptions as OSSRecceActionOptions,\n ThemeColors,\n UseModelColumnsReturn,\n UseMultiNodesActionOptions,\n UseMultiNodesActionReturn,\n UseRunResult,\n} from \"./hooks\";\nexport {\n CheckContextAdapter,\n defaultSqlQuery,\n extractColumns,\n IGNORE_SCREENSHOT_CLASS,\n LineageGraphAdapter,\n QueryContextAdapter,\n RecceActionAdapter,\n RecceShareStateContextProvider,\n unionColumns,\n useCheckEvents,\n useCopyToClipboard,\n useCopyToClipboardButton,\n useCSVExport,\n useFeedbackCollectionToast,\n useImageDownloadModal,\n useIsDark,\n useModelColumns,\n useMultiNodesAction,\n useRecceCheckContext,\n useRecceQueryContext,\n useRecceShareStateContext,\n useRun,\n useThemeColors,\n} from \"./hooks\";\n// NOTE: SchemaDiffRow canonical in @datarecce/ui/types\nexport type {\n SchemaDataGridOptions,\n SchemaDataGridResult,\n SchemaDiffRow,\n SchemaRow,\n SingleEnvSchemaDataGridResult,\n} from \"./lib\";\n// Lib - library utilities including data grid generators\nexport {\n mergeColumns,\n toSchemaDataGrid,\n toSingleEnvDataGrid,\n} from \"./lib\";\n// Provider (main entry point) and Hooks - from providers module\n// NOTE: API hooks (`useApiClient`, `useApiConfig`, `useApiConfigOptional`) canonical in @datarecce/ui/contexts\nexport type {\n Check,\n CheckContextType,\n CheckProviderProps,\n NavigateOptions,\n QueryContextType,\n QueryProviderProps,\n QueryResult,\n RoutingConfig,\n RoutingContextValue,\n} from \"./providers\";\nexport {\n CheckProvider,\n QueryProvider,\n RecceProvider,\n type RecceProviderProps,\n useApiClient,\n useApiConfig,\n useApiConfigOptional,\n useAppLocation,\n useCheckContext,\n useQueryContext,\n useRecceTheme,\n useRouting,\n} from \"./providers\";\n// Theme - colors palette and MUI theme with CSS Variables\n// NOTE: `colors` and `getChartThemeColors` canonical in @datarecce/ui/theme\nexport type { Theme } from \"./theme\";\nexport { colors, theme } from \"./theme\";\n// Utils - utility functions for data manipulation and formatting\n// NOTE: `deltaPercentageString`, `formatTimestamp`, `formatTimeToNow`, `isSchemaChanged`\n// canonical in @datarecce/ui/utils\nexport {\n deltaPercentageString,\n extractSchemas,\n formatTimestamp,\n formatTimeToNow,\n isSchemaChanged,\n} from \"./utils\";\n"],"x_google_ignoreList":[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,134,135,136,137],"mappings":"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"}