@a5c-ai/babysitter-observer-dashboard 5.0.1-staging.7a8768ec

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 (513) hide show
  1. package/.next/BUILD_ID +1 -0
  2. package/.next/app-path-routes-manifest.json +16 -0
  3. package/.next/build-manifest.json +23 -0
  4. package/.next/export-marker.json +6 -0
  5. package/.next/fallback-build-manifest.json +13 -0
  6. package/.next/images-manifest.json +68 -0
  7. package/.next/next-minimal-server.js.nft.json +1 -0
  8. package/.next/next-server.js.nft.json +1 -0
  9. package/.next/package.json +1 -0
  10. package/.next/prerender-manifest.json +114 -0
  11. package/.next/required-server-files.json +334 -0
  12. package/.next/routes-manifest.json +139 -0
  13. package/.next/server/app/_global-error/page/app-paths-manifest.json +3 -0
  14. package/.next/server/app/_global-error/page/build-manifest.json +19 -0
  15. package/.next/server/app/_global-error/page/next-font-manifest.json +6 -0
  16. package/.next/server/app/_global-error/page/react-loadable-manifest.json +1 -0
  17. package/.next/server/app/_global-error/page/server-reference-manifest.json +4 -0
  18. package/.next/server/app/_global-error/page.js +9 -0
  19. package/.next/server/app/_global-error/page.js.map +5 -0
  20. package/.next/server/app/_global-error/page.js.nft.json +1 -0
  21. package/.next/server/app/_global-error/page_client-reference-manifest.js +3 -0
  22. package/.next/server/app/_global-error.html +1 -0
  23. package/.next/server/app/_global-error.meta +15 -0
  24. package/.next/server/app/_global-error.rsc +14 -0
  25. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +5 -0
  26. package/.next/server/app/_global-error.segments/_full.segment.rsc +14 -0
  27. package/.next/server/app/_global-error.segments/_head.segment.rsc +5 -0
  28. package/.next/server/app/_global-error.segments/_index.segment.rsc +5 -0
  29. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  30. package/.next/server/app/_not-found/page/app-paths-manifest.json +3 -0
  31. package/.next/server/app/_not-found/page/build-manifest.json +19 -0
  32. package/.next/server/app/_not-found/page/next-font-manifest.json +6 -0
  33. package/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -0
  34. package/.next/server/app/_not-found/page/server-reference-manifest.json +4 -0
  35. package/.next/server/app/_not-found/page.js +13 -0
  36. package/.next/server/app/_not-found/page.js.map +5 -0
  37. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  38. package/.next/server/app/_not-found/page_client-reference-manifest.js +3 -0
  39. package/.next/server/app/_not-found.html +1 -0
  40. package/.next/server/app/_not-found.meta +16 -0
  41. package/.next/server/app/_not-found.rsc +19 -0
  42. package/.next/server/app/_not-found.segments/_full.segment.rsc +19 -0
  43. package/.next/server/app/_not-found.segments/_head.segment.rsc +6 -0
  44. package/.next/server/app/_not-found.segments/_index.segment.rsc +8 -0
  45. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +6 -0
  46. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +5 -0
  47. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -0
  48. package/.next/server/app/api/config/route/app-paths-manifest.json +3 -0
  49. package/.next/server/app/api/config/route/build-manifest.json +9 -0
  50. package/.next/server/app/api/config/route/server-reference-manifest.json +4 -0
  51. package/.next/server/app/api/config/route.js +8 -0
  52. package/.next/server/app/api/config/route.js.map +5 -0
  53. package/.next/server/app/api/config/route.js.nft.json +1 -0
  54. package/.next/server/app/api/config/route_client-reference-manifest.js +3 -0
  55. package/.next/server/app/api/digest/route/app-paths-manifest.json +3 -0
  56. package/.next/server/app/api/digest/route/build-manifest.json +9 -0
  57. package/.next/server/app/api/digest/route/server-reference-manifest.json +4 -0
  58. package/.next/server/app/api/digest/route.js +9 -0
  59. package/.next/server/app/api/digest/route.js.map +5 -0
  60. package/.next/server/app/api/digest/route.js.nft.json +1 -0
  61. package/.next/server/app/api/digest/route_client-reference-manifest.js +3 -0
  62. package/.next/server/app/api/runs/[runId]/events/route/app-paths-manifest.json +3 -0
  63. package/.next/server/app/api/runs/[runId]/events/route/build-manifest.json +9 -0
  64. package/.next/server/app/api/runs/[runId]/events/route/server-reference-manifest.json +4 -0
  65. package/.next/server/app/api/runs/[runId]/events/route.js +8 -0
  66. package/.next/server/app/api/runs/[runId]/events/route.js.map +5 -0
  67. package/.next/server/app/api/runs/[runId]/events/route.js.nft.json +1 -0
  68. package/.next/server/app/api/runs/[runId]/events/route_client-reference-manifest.js +3 -0
  69. package/.next/server/app/api/runs/[runId]/route/app-paths-manifest.json +3 -0
  70. package/.next/server/app/api/runs/[runId]/route/build-manifest.json +9 -0
  71. package/.next/server/app/api/runs/[runId]/route/server-reference-manifest.json +4 -0
  72. package/.next/server/app/api/runs/[runId]/route.js +9 -0
  73. package/.next/server/app/api/runs/[runId]/route.js.map +5 -0
  74. package/.next/server/app/api/runs/[runId]/route.js.nft.json +1 -0
  75. package/.next/server/app/api/runs/[runId]/route_client-reference-manifest.js +3 -0
  76. package/.next/server/app/api/runs/[runId]/tasks/[effectId]/route/app-paths-manifest.json +3 -0
  77. package/.next/server/app/api/runs/[runId]/tasks/[effectId]/route/build-manifest.json +9 -0
  78. package/.next/server/app/api/runs/[runId]/tasks/[effectId]/route/server-reference-manifest.json +4 -0
  79. package/.next/server/app/api/runs/[runId]/tasks/[effectId]/route.js +8 -0
  80. package/.next/server/app/api/runs/[runId]/tasks/[effectId]/route.js.map +5 -0
  81. package/.next/server/app/api/runs/[runId]/tasks/[effectId]/route.js.nft.json +1 -0
  82. package/.next/server/app/api/runs/[runId]/tasks/[effectId]/route_client-reference-manifest.js +3 -0
  83. package/.next/server/app/api/runs/route/app-paths-manifest.json +3 -0
  84. package/.next/server/app/api/runs/route/build-manifest.json +9 -0
  85. package/.next/server/app/api/runs/route/server-reference-manifest.json +4 -0
  86. package/.next/server/app/api/runs/route.js +9 -0
  87. package/.next/server/app/api/runs/route.js.map +5 -0
  88. package/.next/server/app/api/runs/route.js.nft.json +1 -0
  89. package/.next/server/app/api/runs/route_client-reference-manifest.js +3 -0
  90. package/.next/server/app/api/stream/route/app-paths-manifest.json +3 -0
  91. package/.next/server/app/api/stream/route/build-manifest.json +9 -0
  92. package/.next/server/app/api/stream/route/server-reference-manifest.json +4 -0
  93. package/.next/server/app/api/stream/route.js +8 -0
  94. package/.next/server/app/api/stream/route.js.map +5 -0
  95. package/.next/server/app/api/stream/route.js.nft.json +1 -0
  96. package/.next/server/app/api/stream/route_client-reference-manifest.js +3 -0
  97. package/.next/server/app/api/test/route/app-paths-manifest.json +3 -0
  98. package/.next/server/app/api/test/route/build-manifest.json +9 -0
  99. package/.next/server/app/api/test/route/server-reference-manifest.json +4 -0
  100. package/.next/server/app/api/test/route.js +6 -0
  101. package/.next/server/app/api/test/route.js.map +5 -0
  102. package/.next/server/app/api/test/route.js.nft.json +1 -0
  103. package/.next/server/app/api/test/route_client-reference-manifest.js +3 -0
  104. package/.next/server/app/api/version/route/app-paths-manifest.json +3 -0
  105. package/.next/server/app/api/version/route/build-manifest.json +9 -0
  106. package/.next/server/app/api/version/route/server-reference-manifest.json +4 -0
  107. package/.next/server/app/api/version/route.js +7 -0
  108. package/.next/server/app/api/version/route.js.map +5 -0
  109. package/.next/server/app/api/version/route.js.nft.json +1 -0
  110. package/.next/server/app/api/version/route_client-reference-manifest.js +3 -0
  111. package/.next/server/app/icon.svg/route/app-paths-manifest.json +3 -0
  112. package/.next/server/app/icon.svg/route/build-manifest.json +9 -0
  113. package/.next/server/app/icon.svg/route.js +7 -0
  114. package/.next/server/app/icon.svg/route.js.map +5 -0
  115. package/.next/server/app/icon.svg/route.js.nft.json +1 -0
  116. package/.next/server/app/icon.svg.body +20 -0
  117. package/.next/server/app/icon.svg.meta +1 -0
  118. package/.next/server/app/index.html +1 -0
  119. package/.next/server/app/index.meta +14 -0
  120. package/.next/server/app/index.rsc +21 -0
  121. package/.next/server/app/index.segments/__PAGE__.segment.rsc +9 -0
  122. package/.next/server/app/index.segments/_full.segment.rsc +21 -0
  123. package/.next/server/app/index.segments/_head.segment.rsc +6 -0
  124. package/.next/server/app/index.segments/_index.segment.rsc +8 -0
  125. package/.next/server/app/index.segments/_tree.segment.rsc +2 -0
  126. package/.next/server/app/page/app-paths-manifest.json +3 -0
  127. package/.next/server/app/page/build-manifest.json +19 -0
  128. package/.next/server/app/page/next-font-manifest.json +6 -0
  129. package/.next/server/app/page/react-loadable-manifest.json +1 -0
  130. package/.next/server/app/page/server-reference-manifest.json +17 -0
  131. package/.next/server/app/page.js +15 -0
  132. package/.next/server/app/page.js.map +5 -0
  133. package/.next/server/app/page.js.nft.json +1 -0
  134. package/.next/server/app/page_client-reference-manifest.js +3 -0
  135. package/.next/server/app/runs/[runId]/page/app-paths-manifest.json +3 -0
  136. package/.next/server/app/runs/[runId]/page/build-manifest.json +19 -0
  137. package/.next/server/app/runs/[runId]/page/next-font-manifest.json +6 -0
  138. package/.next/server/app/runs/[runId]/page/react-loadable-manifest.json +22 -0
  139. package/.next/server/app/runs/[runId]/page/server-reference-manifest.json +17 -0
  140. package/.next/server/app/runs/[runId]/page.js +15 -0
  141. package/.next/server/app/runs/[runId]/page.js.map +5 -0
  142. package/.next/server/app/runs/[runId]/page.js.nft.json +1 -0
  143. package/.next/server/app/runs/[runId]/page_client-reference-manifest.js +3 -0
  144. package/.next/server/app-paths-manifest.json +16 -0
  145. package/.next/server/chunks/01oi_server_app_api_runs_[runId]_tasks_[effectId]_route_actions_0r72yai.js +3 -0
  146. package/.next/server/chunks/01oi_server_app_api_runs_[runId]_tasks_[effectId]_route_actions_0r72yai.js.map +1 -0
  147. package/.next/server/chunks/0h.v__next-internal_server_app_api_runs_[runId]_events_route_actions_0~msldk.js +3 -0
  148. package/.next/server/chunks/0h.v__next-internal_server_app_api_runs_[runId]_events_route_actions_0~msldk.js.map +1 -0
  149. package/.next/server/chunks/0h.v__next-internal_server_app_api_runs_[runId]_route_actions_09iz0n6.js +3 -0
  150. package/.next/server/chunks/0h.v__next-internal_server_app_api_runs_[runId]_route_actions_09iz0n6.js.map +1 -0
  151. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_config_route_actions_0~eypoa.js +3 -0
  152. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_config_route_actions_0~eypoa.js.map +1 -0
  153. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_digest_route_actions_04jj5zs.js +3 -0
  154. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_digest_route_actions_04jj5zs.js.map +1 -0
  155. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_runs_route_actions_0~-t-o4.js +3 -0
  156. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_runs_route_actions_0~-t-o4.js.map +1 -0
  157. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_stream_route_actions_0fkmv2_.js +3 -0
  158. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_stream_route_actions_0fkmv2_.js.map +1 -0
  159. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_test_route_actions_00ugava.js +3 -0
  160. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_test_route_actions_00ugava.js.map +1 -0
  161. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_version_route_actions_0~v3ojm.js +3 -0
  162. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_api_version_route_actions_0~v3ojm.js.map +1 -0
  163. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_icon_svg_route_actions_0yypxkm.js +3 -0
  164. package/.next/server/chunks/0juq_observer-dashboard__next-internal_server_app_icon_svg_route_actions_0yypxkm.js.map +1 -0
  165. package/.next/server/chunks/[root-of-the-server]__0.6bt.6._.js +3 -0
  166. package/.next/server/chunks/[root-of-the-server]__0.6bt.6._.js.map +1 -0
  167. package/.next/server/chunks/[root-of-the-server]__08kwev1._.js +3 -0
  168. package/.next/server/chunks/[root-of-the-server]__08kwev1._.js.map +1 -0
  169. package/.next/server/chunks/[root-of-the-server]__096el.d._.js +3 -0
  170. package/.next/server/chunks/[root-of-the-server]__096el.d._.js.map +1 -0
  171. package/.next/server/chunks/[root-of-the-server]__0_bmt4z._.js +3 -0
  172. package/.next/server/chunks/[root-of-the-server]__0_bmt4z._.js.map +1 -0
  173. package/.next/server/chunks/[root-of-the-server]__0_ln2d2._.js +3 -0
  174. package/.next/server/chunks/[root-of-the-server]__0_ln2d2._.js.map +1 -0
  175. package/.next/server/chunks/[root-of-the-server]__0al3v65._.js +3 -0
  176. package/.next/server/chunks/[root-of-the-server]__0al3v65._.js.map +1 -0
  177. package/.next/server/chunks/[root-of-the-server]__0gf516b._.js +3 -0
  178. package/.next/server/chunks/[root-of-the-server]__0gf516b._.js.map +1 -0
  179. package/.next/server/chunks/[root-of-the-server]__0kdfw4x._.js +3 -0
  180. package/.next/server/chunks/[root-of-the-server]__0kdfw4x._.js.map +1 -0
  181. package/.next/server/chunks/[root-of-the-server]__0pxt00h._.js +3 -0
  182. package/.next/server/chunks/[root-of-the-server]__0pxt00h._.js.map +1 -0
  183. package/.next/server/chunks/[root-of-the-server]__0rubnza._.js +3 -0
  184. package/.next/server/chunks/[root-of-the-server]__0rubnza._.js.map +1 -0
  185. package/.next/server/chunks/[root-of-the-server]__0tn9iud._.js +3 -0
  186. package/.next/server/chunks/[root-of-the-server]__0tn9iud._.js.map +1 -0
  187. package/.next/server/chunks/[root-of-the-server]__0ws5o6i._.js +3 -0
  188. package/.next/server/chunks/[root-of-the-server]__0ws5o6i._.js.map +1 -0
  189. package/.next/server/chunks/[turbopack]_runtime.js +903 -0
  190. package/.next/server/chunks/[turbopack]_runtime.js.map +11 -0
  191. package/.next/server/chunks/node_modules_next_04~_e52._.js +13 -0
  192. package/.next/server/chunks/node_modules_next_04~_e52._.js.map +1 -0
  193. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0nyyph-.js +9 -0
  194. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0nyyph-.js.map +1 -0
  195. package/.next/server/chunks/packages_observer-dashboard_src_lib_02.vvb.._.js +3 -0
  196. package/.next/server/chunks/packages_observer-dashboard_src_lib_02.vvb.._.js.map +1 -0
  197. package/.next/server/chunks/packages_observer-dashboard_src_lib_0rqgpk0._.js +3 -0
  198. package/.next/server/chunks/packages_observer-dashboard_src_lib_0rqgpk0._.js.map +1 -0
  199. package/.next/server/chunks/ssr/0juq_observer-dashboard__next-internal_server_app__global-error_page_actions_0ekoxmy.js +3 -0
  200. package/.next/server/chunks/ssr/0juq_observer-dashboard__next-internal_server_app__global-error_page_actions_0ekoxmy.js.map +1 -0
  201. package/.next/server/chunks/ssr/0juq_observer-dashboard__next-internal_server_app__not-found_page_actions_09b3ti3.js +3 -0
  202. package/.next/server/chunks/ssr/0juq_observer-dashboard__next-internal_server_app__not-found_page_actions_09b3ti3.js.map +1 -0
  203. package/.next/server/chunks/ssr/[root-of-the-server]__006f7~t._.js +4 -0
  204. package/.next/server/chunks/ssr/[root-of-the-server]__006f7~t._.js.map +1 -0
  205. package/.next/server/chunks/ssr/[root-of-the-server]__02jgvbi._.js +3 -0
  206. package/.next/server/chunks/ssr/[root-of-the-server]__02jgvbi._.js.map +1 -0
  207. package/.next/server/chunks/ssr/[root-of-the-server]__04j8t~1._.js +3 -0
  208. package/.next/server/chunks/ssr/[root-of-the-server]__04j8t~1._.js.map +1 -0
  209. package/.next/server/chunks/ssr/[root-of-the-server]__09c~s.0._.js +33 -0
  210. package/.next/server/chunks/ssr/[root-of-the-server]__09c~s.0._.js.map +1 -0
  211. package/.next/server/chunks/ssr/[root-of-the-server]__0cpy61n._.js +3 -0
  212. package/.next/server/chunks/ssr/[root-of-the-server]__0cpy61n._.js.map +1 -0
  213. package/.next/server/chunks/ssr/[root-of-the-server]__0cwa32j._.js +3 -0
  214. package/.next/server/chunks/ssr/[root-of-the-server]__0cwa32j._.js.map +1 -0
  215. package/.next/server/chunks/ssr/[root-of-the-server]__0fk_g0j._.js +19 -0
  216. package/.next/server/chunks/ssr/[root-of-the-server]__0fk_g0j._.js.map +1 -0
  217. package/.next/server/chunks/ssr/[root-of-the-server]__0pddpic._.js +3 -0
  218. package/.next/server/chunks/ssr/[root-of-the-server]__0pddpic._.js.map +1 -0
  219. package/.next/server/chunks/ssr/[root-of-the-server]__0pvtneq._.js +3 -0
  220. package/.next/server/chunks/ssr/[root-of-the-server]__0pvtneq._.js.map +1 -0
  221. package/.next/server/chunks/ssr/[root-of-the-server]__0xc-2vm._.js +3 -0
  222. package/.next/server/chunks/ssr/[root-of-the-server]__0xc-2vm._.js.map +1 -0
  223. package/.next/server/chunks/ssr/[root-of-the-server]__10xgshr._.js +33 -0
  224. package/.next/server/chunks/ssr/[root-of-the-server]__10xgshr._.js.map +1 -0
  225. package/.next/server/chunks/ssr/[turbopack]_runtime.js +903 -0
  226. package/.next/server/chunks/ssr/[turbopack]_runtime.js.map +11 -0
  227. package/.next/server/chunks/ssr/_00yo1im._.js +3 -0
  228. package/.next/server/chunks/ssr/_00yo1im._.js.map +1 -0
  229. package/.next/server/chunks/ssr/_03sbc.o._.js +3 -0
  230. package/.next/server/chunks/ssr/_03sbc.o._.js.map +1 -0
  231. package/.next/server/chunks/ssr/_04z5ea0._.js +3 -0
  232. package/.next/server/chunks/ssr/_04z5ea0._.js.map +1 -0
  233. package/.next/server/chunks/ssr/_0gmb3g_._.js +3 -0
  234. package/.next/server/chunks/ssr/_0gmb3g_._.js.map +1 -0
  235. package/.next/server/chunks/ssr/_0okz9j8._.js +6 -0
  236. package/.next/server/chunks/ssr/_0okz9j8._.js.map +1 -0
  237. package/.next/server/chunks/ssr/_0wrbwro._.js +6 -0
  238. package/.next/server/chunks/ssr/_0wrbwro._.js.map +1 -0
  239. package/.next/server/chunks/ssr/node_modules_09w7yel._.js +33 -0
  240. package/.next/server/chunks/ssr/node_modules_09w7yel._.js.map +1 -0
  241. package/.next/server/chunks/ssr/node_modules_next_dist_0avqw4q._.js +3 -0
  242. package/.next/server/chunks/ssr/node_modules_next_dist_0avqw4q._.js.map +1 -0
  243. package/.next/server/chunks/ssr/node_modules_next_dist_0h9llsw._.js +6 -0
  244. package/.next/server/chunks/ssr/node_modules_next_dist_0h9llsw._.js.map +1 -0
  245. package/.next/server/chunks/ssr/node_modules_next_dist_0i_._k3._.js +3 -0
  246. package/.next/server/chunks/ssr/node_modules_next_dist_0i_._k3._.js.map +1 -0
  247. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0ee1czk._.js +3 -0
  248. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0ee1czk._.js.map +1 -0
  249. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0lgvd_..js +3 -0
  250. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0lgvd_..js.map +1 -0
  251. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0cjv-23.js +3 -0
  252. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0cjv-23.js.map +1 -0
  253. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0amzg6z.js +4 -0
  254. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0amzg6z.js.map +1 -0
  255. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0dw1x0d.js +4 -0
  256. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0dw1x0d.js.map +1 -0
  257. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0rc3ul_.js +4 -0
  258. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0rc3ul_.js.map +1 -0
  259. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_10iomok.js +4 -0
  260. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_10iomok.js.map +1 -0
  261. package/.next/server/chunks/ssr/packages_observer-dashboard_0~a2tmu._.js +3 -0
  262. package/.next/server/chunks/ssr/packages_observer-dashboard_0~a2tmu._.js.map +1 -0
  263. package/.next/server/chunks/ssr/packages_observer-dashboard_src_0f.ozc-._.js +3 -0
  264. package/.next/server/chunks/ssr/packages_observer-dashboard_src_0f.ozc-._.js.map +1 -0
  265. package/.next/server/chunks/ssr/packages_observer-dashboard_src_components_providers_tsx_03_vrrn._.js +7 -0
  266. package/.next/server/chunks/ssr/packages_observer-dashboard_src_components_providers_tsx_03_vrrn._.js.map +1 -0
  267. package/.next/server/functions-config-manifest.json +4 -0
  268. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  269. package/.next/server/middleware-build-manifest.js +23 -0
  270. package/.next/server/middleware-manifest.json +6 -0
  271. package/.next/server/next-font-manifest.js +1 -0
  272. package/.next/server/next-font-manifest.json +6 -0
  273. package/.next/server/pages/404.html +1 -0
  274. package/.next/server/pages/500.html +1 -0
  275. package/.next/server/pages-manifest.json +4 -0
  276. package/.next/server/prefetch-hints.json +1 -0
  277. package/.next/server/server-reference-manifest.js +1 -0
  278. package/.next/server/server-reference-manifest.json +24 -0
  279. package/.next/static/MvfPly4ZXHqaveDVOG1qq/_buildManifest.js +11 -0
  280. package/.next/static/MvfPly4ZXHqaveDVOG1qq/_clientMiddlewareManifest.js +1 -0
  281. package/.next/static/MvfPly4ZXHqaveDVOG1qq/_ssgManifest.js +1 -0
  282. package/.next/static/chunks/00c87uqn~kk2z.js +1 -0
  283. package/.next/static/chunks/01xlw8hd842-c.js +1 -0
  284. package/.next/static/chunks/02p9dpa.0oxiz.js +1 -0
  285. package/.next/static/chunks/034i63v_muq~d.js +1 -0
  286. package/.next/static/chunks/03mo-6~4pxdio.js +1 -0
  287. package/.next/static/chunks/03~yq9q893hmn.js +1 -0
  288. package/.next/static/chunks/04dm5qn77.fc2.js +1 -0
  289. package/.next/static/chunks/07uz2g0_38qia.js +4 -0
  290. package/.next/static/chunks/08nqnwvixoxnk.js +2 -0
  291. package/.next/static/chunks/0d3shmwh5_nmn.js +1 -0
  292. package/.next/static/chunks/0e_wyjw3nx.a..js +1 -0
  293. package/.next/static/chunks/0mstyq17cbf8-.js +1 -0
  294. package/.next/static/chunks/0ntuxw9.how-q.js +1 -0
  295. package/.next/static/chunks/0t3uzajv1qzmo.js +1 -0
  296. package/.next/static/chunks/0u~_nwr5-v.xp.js +1 -0
  297. package/.next/static/chunks/0wxcxh6eyzams.js +1 -0
  298. package/.next/static/chunks/0x6y7yt4kiddp.css +1 -0
  299. package/.next/static/chunks/0z6-vonyxr0dn.js +4 -0
  300. package/.next/static/chunks/0ze4gu236oq96.js +31 -0
  301. package/.next/static/chunks/0zwozael9msy1.js +1 -0
  302. package/.next/static/chunks/10qd__0r7a~.l.js +1 -0
  303. package/.next/static/chunks/11jh_u1ynmatg.js +1 -0
  304. package/.next/static/chunks/13xer3cb9shu-.js +5 -0
  305. package/.next/static/chunks/142zlnch_xmgd.js +1 -0
  306. package/.next/static/chunks/144kcri75qczu.js +1 -0
  307. package/.next/static/chunks/turbopack-0-ww6fe7b37qt.js +1 -0
  308. package/.next/static/media/icon.08ljfy7xai2x_.svg +20 -0
  309. package/LICENSE +21 -0
  310. package/README.md +490 -0
  311. package/next.config.mjs +25 -0
  312. package/package.json +104 -0
  313. package/postcss.config.mjs +8 -0
  314. package/src/app/actions/__tests__/approve-breakpoint.test.ts +246 -0
  315. package/src/app/actions/approve-breakpoint.ts +145 -0
  316. package/src/app/api/config/route.ts +137 -0
  317. package/src/app/api/digest/route.ts +45 -0
  318. package/src/app/api/runs/[runId]/events/route.ts +56 -0
  319. package/src/app/api/runs/[runId]/route.ts +84 -0
  320. package/src/app/api/runs/[runId]/tasks/[effectId]/route.ts +44 -0
  321. package/src/app/api/runs/route.ts +48 -0
  322. package/src/app/api/stream/route.ts +136 -0
  323. package/src/app/api/test/route.ts +1 -0
  324. package/src/app/api/version/route.ts +57 -0
  325. package/src/app/globals.css +555 -0
  326. package/src/app/icon.svg +20 -0
  327. package/src/app/layout.tsx +39 -0
  328. package/src/app/not-found.tsx +16 -0
  329. package/src/app/page.tsx +120 -0
  330. package/src/app/runs/[runId]/page.tsx +279 -0
  331. package/src/cli.ts +271 -0
  332. package/src/components/breakpoint/__tests__/breakpoint-approval.test.tsx +212 -0
  333. package/src/components/breakpoint/__tests__/breakpoint-panel.test.tsx +130 -0
  334. package/src/components/breakpoint/__tests__/file-preview.test.tsx +313 -0
  335. package/src/components/breakpoint/breakpoint-approval.tsx +138 -0
  336. package/src/components/breakpoint/breakpoint-panel.tsx +95 -0
  337. package/src/components/breakpoint/file-preview.tsx +215 -0
  338. package/src/components/dashboard/.gitkeep +0 -0
  339. package/src/components/dashboard/__tests__/breakpoint-banner.test.tsx +177 -0
  340. package/src/components/dashboard/__tests__/catch-up-banner.test.tsx +141 -0
  341. package/src/components/dashboard/__tests__/executive-summary-banner.test.tsx +164 -0
  342. package/src/components/dashboard/__tests__/kpi-grid.test.tsx +101 -0
  343. package/src/components/dashboard/__tests__/pagination-controls.test.tsx +125 -0
  344. package/src/components/dashboard/__tests__/project-accordion.test.tsx +97 -0
  345. package/src/components/dashboard/__tests__/project-list-view.test.tsx +174 -0
  346. package/src/components/dashboard/__tests__/project-search-input.test.tsx +110 -0
  347. package/src/components/dashboard/__tests__/project-section-header.test.tsx +91 -0
  348. package/src/components/dashboard/__tests__/project-section.test.tsx +151 -0
  349. package/src/components/dashboard/__tests__/run-card.test.tsx +164 -0
  350. package/src/components/dashboard/__tests__/run-filter-bar.test.tsx +109 -0
  351. package/src/components/dashboard/__tests__/run-list.test.tsx +123 -0
  352. package/src/components/dashboard/__tests__/search-filter.test.tsx +150 -0
  353. package/src/components/dashboard/__tests__/virtualized-run-list.test.tsx +179 -0
  354. package/src/components/dashboard/breakpoint-banner.tsx +301 -0
  355. package/src/components/dashboard/catch-up-banner.tsx +88 -0
  356. package/src/components/dashboard/executive-summary-banner.tsx +174 -0
  357. package/src/components/dashboard/global-search.tsx +323 -0
  358. package/src/components/dashboard/kpi-grid.tsx +140 -0
  359. package/src/components/dashboard/pagination-controls.tsx +100 -0
  360. package/src/components/dashboard/project-accordion.tsx +72 -0
  361. package/src/components/dashboard/project-health-card.tsx +536 -0
  362. package/src/components/dashboard/project-list-view.tsx +246 -0
  363. package/src/components/dashboard/project-search-input.tsx +41 -0
  364. package/src/components/dashboard/project-section-header.tsx +73 -0
  365. package/src/components/dashboard/project-section.tsx +89 -0
  366. package/src/components/dashboard/run-card.tsx +218 -0
  367. package/src/components/dashboard/run-filter-bar.tsx +100 -0
  368. package/src/components/dashboard/run-list.tsx +77 -0
  369. package/src/components/dashboard/search-filter.tsx +69 -0
  370. package/src/components/dashboard/virtualized-run-list.tsx +130 -0
  371. package/src/components/details/.gitkeep +0 -0
  372. package/src/components/details/__tests__/agent-panel.test.tsx +236 -0
  373. package/src/components/details/__tests__/json-tree.test.tsx +347 -0
  374. package/src/components/details/__tests__/log-viewer.test.tsx +168 -0
  375. package/src/components/details/__tests__/task-detail.test.tsx +212 -0
  376. package/src/components/details/__tests__/timing-panel.test.tsx +271 -0
  377. package/src/components/details/agent-panel.tsx +234 -0
  378. package/src/components/details/json-tree/categorize.ts +131 -0
  379. package/src/components/details/json-tree/index.tsx +120 -0
  380. package/src/components/details/json-tree/json-node.tsx +223 -0
  381. package/src/components/details/json-tree/smart-summary.tsx +596 -0
  382. package/src/components/details/json-tree/tree-controls.tsx +47 -0
  383. package/src/components/details/json-tree.tsx +9 -0
  384. package/src/components/details/log-viewer.tsx +140 -0
  385. package/src/components/details/task-detail.tsx +114 -0
  386. package/src/components/details/timing-panel.tsx +247 -0
  387. package/src/components/events/.gitkeep +0 -0
  388. package/src/components/events/__tests__/event-item.test.tsx +211 -0
  389. package/src/components/events/__tests__/event-stream.test.tsx +225 -0
  390. package/src/components/events/event-item.tsx +121 -0
  391. package/src/components/events/event-stream.tsx +260 -0
  392. package/src/components/notifications/.gitkeep +0 -0
  393. package/src/components/notifications/__tests__/notification-panel.test.tsx +287 -0
  394. package/src/components/notifications/__tests__/notification-provider.test.tsx +585 -0
  395. package/src/components/notifications/__tests__/toast-stack.test.tsx +217 -0
  396. package/src/components/notifications/notification-panel.tsx +124 -0
  397. package/src/components/notifications/notification-provider.tsx +175 -0
  398. package/src/components/notifications/toast-stack.tsx +75 -0
  399. package/src/components/pipeline/.gitkeep +0 -0
  400. package/src/components/pipeline/__tests__/parallel-group.test.tsx +88 -0
  401. package/src/components/pipeline/__tests__/pipeline-view.test.tsx +345 -0
  402. package/src/components/pipeline/__tests__/step-card.test.tsx +330 -0
  403. package/src/components/pipeline/parallel-group.tsx +39 -0
  404. package/src/components/pipeline/pipeline-view.tsx +197 -0
  405. package/src/components/pipeline/step-card.tsx +166 -0
  406. package/src/components/providers/event-stream-provider.tsx +29 -0
  407. package/src/components/providers.tsx +24 -0
  408. package/src/components/shared/.gitkeep +0 -0
  409. package/src/components/shared/__tests__/empty-state.test.tsx +49 -0
  410. package/src/components/shared/__tests__/friendly-id.test.tsx +47 -0
  411. package/src/components/shared/__tests__/kbd.test.tsx +45 -0
  412. package/src/components/shared/__tests__/kind-badge.test.tsx +71 -0
  413. package/src/components/shared/__tests__/metrics-row.test.tsx +74 -0
  414. package/src/components/shared/__tests__/outcome-banner.test.tsx +71 -0
  415. package/src/components/shared/__tests__/progress-bar.test.tsx +89 -0
  416. package/src/components/shared/__tests__/session-pill.test.tsx +62 -0
  417. package/src/components/shared/__tests__/settings-modal.test.tsx +201 -0
  418. package/src/components/shared/__tests__/shortcuts-help.test.tsx +103 -0
  419. package/src/components/shared/__tests__/status-badge.test.tsx +98 -0
  420. package/src/components/shared/__tests__/theme-provider.test.tsx +100 -0
  421. package/src/components/shared/__tests__/truncated-id.test.tsx +53 -0
  422. package/src/components/shared/app-footer.tsx +80 -0
  423. package/src/components/shared/app-header.tsx +160 -0
  424. package/src/components/shared/empty-state.tsx +18 -0
  425. package/src/components/shared/error-boundary.tsx +81 -0
  426. package/src/components/shared/friendly-id.tsx +48 -0
  427. package/src/components/shared/kbd.tsx +15 -0
  428. package/src/components/shared/kind-badge.tsx +51 -0
  429. package/src/components/shared/metrics-row.tsx +106 -0
  430. package/src/components/shared/outcome-banner.tsx +56 -0
  431. package/src/components/shared/progress-bar.tsx +42 -0
  432. package/src/components/shared/session-pill.tsx +69 -0
  433. package/src/components/shared/settings-modal.tsx +509 -0
  434. package/src/components/shared/shortcuts-help.tsx +113 -0
  435. package/src/components/shared/status-badge.tsx +110 -0
  436. package/src/components/shared/theme-provider.tsx +46 -0
  437. package/src/components/shared/truncated-id.tsx +51 -0
  438. package/src/components/ui/.gitkeep +0 -0
  439. package/src/components/ui/__tests__/accordion.test.tsx +96 -0
  440. package/src/components/ui/__tests__/badge.test.tsx +69 -0
  441. package/src/components/ui/__tests__/button.test.tsx +113 -0
  442. package/src/components/ui/__tests__/tabs.test.tsx +75 -0
  443. package/src/components/ui/__tests__/tooltip.test.tsx +90 -0
  444. package/src/components/ui/accordion.tsx +61 -0
  445. package/src/components/ui/badge.tsx +25 -0
  446. package/src/components/ui/button.tsx +40 -0
  447. package/src/components/ui/card.tsx +21 -0
  448. package/src/components/ui/scroll-area.tsx +35 -0
  449. package/src/components/ui/separator.tsx +24 -0
  450. package/src/components/ui/tabs.tsx +64 -0
  451. package/src/components/ui/tooltip.tsx +37 -0
  452. package/src/hooks/.gitkeep +0 -0
  453. package/src/hooks/__tests__/use-animated-number.test.ts +184 -0
  454. package/src/hooks/__tests__/use-batched-updates.test.ts +315 -0
  455. package/src/hooks/__tests__/use-event-stream.test.ts +243 -0
  456. package/src/hooks/__tests__/use-keyboard.test.ts +217 -0
  457. package/src/hooks/__tests__/use-notifications.test.ts +230 -0
  458. package/src/hooks/__tests__/use-polling.test.ts +274 -0
  459. package/src/hooks/__tests__/use-project-runs.test.ts +163 -0
  460. package/src/hooks/__tests__/use-projects.test.ts +248 -0
  461. package/src/hooks/__tests__/use-run-dashboard.test.ts +168 -0
  462. package/src/hooks/__tests__/use-run-detail.test.ts +273 -0
  463. package/src/hooks/__tests__/use-smart-polling.test.ts +305 -0
  464. package/src/hooks/use-animated-number.ts +87 -0
  465. package/src/hooks/use-batched-updates.ts +150 -0
  466. package/src/hooks/use-event-stream.ts +150 -0
  467. package/src/hooks/use-keyboard.ts +45 -0
  468. package/src/hooks/use-notifications.ts +82 -0
  469. package/src/hooks/use-persisted-state.ts +60 -0
  470. package/src/hooks/use-polling.ts +60 -0
  471. package/src/hooks/use-project-runs.ts +51 -0
  472. package/src/hooks/use-projects.ts +26 -0
  473. package/src/hooks/use-run-dashboard.ts +207 -0
  474. package/src/hooks/use-run-detail.ts +77 -0
  475. package/src/hooks/use-smart-polling.ts +144 -0
  476. package/src/lib/.gitkeep +0 -0
  477. package/src/lib/__tests__/cn.test.ts +69 -0
  478. package/src/lib/__tests__/config-loader.test.ts +210 -0
  479. package/src/lib/__tests__/config.test.ts +561 -0
  480. package/src/lib/__tests__/error-handler.test.ts +143 -0
  481. package/src/lib/__tests__/fetcher.test.ts +517 -0
  482. package/src/lib/__tests__/global-registry.test.ts +214 -0
  483. package/src/lib/__tests__/parser.test.ts +1532 -0
  484. package/src/lib/__tests__/path-resolver.test.ts +112 -0
  485. package/src/lib/__tests__/run-cache.test.ts +591 -0
  486. package/src/lib/__tests__/server-init.test.ts +512 -0
  487. package/src/lib/__tests__/source-discovery.test.ts +246 -0
  488. package/src/lib/__tests__/utils.test.ts +160 -0
  489. package/src/lib/__tests__/watcher.test.ts +227 -0
  490. package/src/lib/cn.ts +6 -0
  491. package/src/lib/config-loader.ts +195 -0
  492. package/src/lib/config.ts +20 -0
  493. package/src/lib/error-handler.ts +76 -0
  494. package/src/lib/fetcher.ts +394 -0
  495. package/src/lib/global-registry.ts +117 -0
  496. package/src/lib/parser.ts +794 -0
  497. package/src/lib/path-resolver.ts +16 -0
  498. package/src/lib/run-cache.ts +404 -0
  499. package/src/lib/server-init.ts +226 -0
  500. package/src/lib/services/__tests__/run-query-service.test.ts +819 -0
  501. package/src/lib/services/run-query-service.ts +286 -0
  502. package/src/lib/source-discovery.ts +216 -0
  503. package/src/lib/utils.ts +103 -0
  504. package/src/lib/watcher.ts +265 -0
  505. package/src/test/fixtures.ts +269 -0
  506. package/src/test/mocks/handlers.ts +110 -0
  507. package/src/test/mocks/server.ts +17 -0
  508. package/src/test/setup.ts +200 -0
  509. package/src/test/test-utils.tsx +36 -0
  510. package/src/types/.gitkeep +0 -0
  511. package/src/types/breakpoint.ts +17 -0
  512. package/src/types/index.ts +214 -0
  513. package/tsconfig.json +50 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../node_modules/next/src/build/webpack/loaders/next-flight-loader/action-client-wrapper.ts","../../../../../../packages/observer-dashboard/src/hooks/use-persisted-state.ts","../../../../../../packages/observer-dashboard/src/hooks/use-run-dashboard.ts","../../../../../../packages/observer-dashboard/src/app/actions/data%3A829dbf%20%3Ctext/javascript%3E","../../../../../../packages/observer-dashboard/src/components/dashboard/breakpoint-banner.tsx","../../../../../../packages/observer-dashboard/src/components/dashboard/catch-up-banner.tsx","../../../../../../packages/observer-dashboard/src/components/dashboard/executive-summary-banner.tsx","../../../../../../packages/observer-dashboard/src/hooks/use-projects.ts","../../../../../../packages/observer-dashboard/src/hooks/use-animated-number.ts","../../../../../../packages/observer-dashboard/src/components/dashboard/kpi-grid.tsx","../../../../../../packages/observer-dashboard/src/components/dashboard/run-filter-bar.tsx","../../../../../../node_modules/class-variance-authority/dist/index.mjs","../../../../../../node_modules/%40floating-ui/utils/dist/floating-ui.utils.mjs","../../../../../../node_modules/%40floating-ui/utils/dist/floating-ui.utils.dom.mjs","../../../../../../packages/observer-dashboard/src/app/page.tsx","../../../../../../node_modules/%40radix-ui/react-popper/dist/index.mjs","../../../../../../node_modules/%40radix-ui/react-tooltip/dist/index.mjs","../../../../../../packages/observer-dashboard/src/components/ui/tooltip.tsx","../../../../../../packages/observer-dashboard/src/components/shared/session-pill.tsx","../../../../../../packages/observer-dashboard/src/components/shared/truncated-id.tsx","../../../../../../packages/observer-dashboard/src/components/dashboard/run-card.tsx","../../../../../../packages/observer-dashboard/src/components/dashboard/virtualized-run-list.tsx","../../../../../../packages/observer-dashboard/src/components/dashboard/pagination-controls.tsx","../../../../../../packages/observer-dashboard/src/hooks/use-project-runs.ts","../../../../../../packages/observer-dashboard/src/components/dashboard/project-health-card.tsx","../../../../../../packages/observer-dashboard/src/components/dashboard/project-list-view.tsx","../../../../../../packages/observer-dashboard/src/hooks/use-batched-updates.ts","../../../../../../packages/observer-dashboard/src/components/dashboard/global-search.tsx","../../../../../../node_modules/%40tanstack/virtual-core/src/utils.ts","../../../../../../node_modules/%40tanstack/virtual-core/src/index.ts","../../../../../../node_modules/%40radix-ui/react-use-size/src/use-size.tsx","../../../../../../node_modules/%40radix-ui/react-visually-hidden/src/visually-hidden.tsx","../../../../../../node_modules/%40radix-ui/react-arrow/src/arrow.tsx","../../../../../../node_modules/%40radix-ui/react-tooltip/node_modules/%40radix-ui/react-slot/src/slot.tsx","../../../../../../node_modules/%40radix-ui/react-arrow/dist/index.mjs","../../../../../../packages/observer-dashboard/src/components/ui/card.tsx","../../../../../../packages/observer-dashboard/src/components/ui/badge.tsx","../../../../../../packages/observer-dashboard/src/components/shared/status-badge.tsx","../../../../../../node_modules/%40floating-ui/core/dist/floating-ui.core.mjs","../../../../../../node_modules/%40radix-ui/react-use-size/dist/index.mjs","../../../../../../node_modules/%40radix-ui/react-popper/src/popper.tsx","../../../../../../node_modules/%40radix-ui/react-tooltip/src/tooltip.tsx","../../../../../../node_modules/%40radix-ui/react-tooltip/node_modules/%40radix-ui/react-slot/dist/index.mjs","../../../../../../node_modules/%40radix-ui/react-visually-hidden/dist/index.mjs","../../../../../../packages/observer-dashboard/src/components/shared/progress-bar.tsx","../../../../../../node_modules/%40floating-ui/react-dom/dist/floating-ui.react-dom.mjs","../../../../../../node_modules/%40tanstack/react-virtual/src/index.tsx","../../../../../../node_modules/%40floating-ui/dom/dist/floating-ui.dom.mjs","../../../../../../packages/observer-dashboard/node_modules/lucide-react/src/icons/arrow-right.ts","../../../../../../packages/observer-dashboard/node_modules/lucide-react/src/icons/history.ts","../../../../../../packages/observer-dashboard/node_modules/lucide-react/src/icons/hand.ts","../../../../../../packages/observer-dashboard/node_modules/lucide-react/src/icons/activity.ts","../../../../../../packages/observer-dashboard/node_modules/lucide-react/src/icons/chevron-right.ts","../../../../../../packages/observer-dashboard/node_modules/lucide-react/src/icons/chevron-up.ts","../../../../../../packages/observer-dashboard/node_modules/lucide-react/src/icons/chevron-down.ts","../../../../../../packages/observer-dashboard/node_modules/lucide-react/src/icons/alert-circle.ts","../../../../../../packages/observer-dashboard/node_modules/lucide-react/src/icons/circle.ts","../../../../../../packages/observer-dashboard/node_modules/lucide-react/src/icons/chevron-left.ts","../../../../../../packages/observer-dashboard/node_modules/lucide-react/src/icons/inbox.ts","../../../../../../packages/observer-dashboard/node_modules/lucide-react/src/icons/arrow-up-down.ts","../../../../../../packages/observer-dashboard/node_modules/lucide-react/src/icons/search.ts","../../../../../../packages/observer-dashboard/node_modules/lucide-react/src/icons/tag.ts","../../../../../../packages/observer-dashboard/node_modules/lucide-react/src/icons/layers.ts"],"sourcesContent":["// This file must be bundled in the app's client layer, it shouldn't be directly\n// imported by the server.\n\nexport { callServer } from 'next/dist/client/app-call-server'\nexport { findSourceMapURL } from 'next/dist/client/app-find-source-map-url'\n\n// A noop wrapper to let the Flight client create the server reference.\n// See also: https://github.com/facebook/react/pull/26632\n// eslint-disable-next-line import/no-extraneous-dependencies\nexport { createServerReference } from 'react-server-dom-webpack/client'\n","\"use client\";\nimport { useState, useCallback, useLayoutEffect, useEffect } from \"react\";\n\nconst NAMESPACE = \"observer:\";\n\n// useLayoutEffect on client (runs before paint → no flash),\n// useEffect on server (suppresses Next.js SSR warning).\nconst useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\n/**\n * Custom hook that wraps useState with localStorage persistence.\n * Values are serialized with JSON.stringify/parse and namespaced\n * under the \"observer:\" prefix to avoid collisions.\n *\n * Hydration-safe: first render uses defaultValue (matching SSR),\n * then useLayoutEffect reads localStorage before the browser paints\n * so the persisted value appears with no visible flash.\n */\nexport function usePersistedState<T>(\n key: string,\n defaultValue: T\n): [T, (value: T | ((prev: T) => T)) => void] {\n const prefixedKey = key.startsWith(NAMESPACE) ? key : `${NAMESPACE}${key}`;\n\n // Always start with defaultValue to match SSR output (hydration-safe).\n const [state, setState] = useState<T>(defaultValue);\n\n // Read localStorage before paint — avoids both hydration mismatch and flash.\n useIsomorphicLayoutEffect(() => {\n try {\n const stored = window.localStorage.getItem(prefixedKey);\n if (stored !== null) {\n const parsed = JSON.parse(stored) as T;\n setState(parsed);\n }\n } catch {\n // localStorage unavailable — keep default\n }\n }, [prefixedKey]);\n\n const setPersistedState = useCallback(\n (value: T | ((prev: T) => T)) => {\n setState((prev) => {\n const next = typeof value === \"function\" ? (value as (prev: T) => T)(prev) : value;\n try {\n if (typeof window !== \"undefined\") {\n window.localStorage.setItem(prefixedKey, JSON.stringify(next));\n }\n } catch {\n // localStorage may be full or blocked — silently ignore\n }\n return next;\n });\n },\n [prefixedKey]\n );\n\n return [state, setPersistedState];\n}\n","\"use client\";\nimport { useState, useMemo, useCallback, useRef } from \"react\";\nimport { useProjects } from \"./use-projects\";\nimport { useBatchedUpdates, type CatchUpState } from \"./use-batched-updates\";\nimport { usePersistedState } from \"./use-persisted-state\";\nimport type { RunStatus, ProjectSummary, BreakpointRunInfo } from \"@/types\";\nimport type { ExecutiveSummaryMetrics } from \"@/components/dashboard/executive-summary-banner\";\n\n/** Aggregated KPI metrics across all projects. */\nexport interface DashboardMetrics {\n totalRuns: number;\n activeRuns: number;\n completedRuns: number;\n failedRuns: number;\n staleRuns: number;\n totalTasks: number;\n completedTasks: number;\n}\n\nexport type DashboardSortMode = \"status\" | \"activity\";\nexport type DashboardStatusFilter = RunStatus | \"all\" | \"stale\";\n\nexport interface UseRunDashboardReturn {\n // Data\n projects: ProjectSummary[];\n loading: boolean;\n error: string | null | undefined;\n metrics: DashboardMetrics;\n allBreakpointRuns: BreakpointRunInfo[];\n summaryMetrics: ExecutiveSummaryMetrics;\n bannerFingerprint: string;\n bannerDismissed: boolean;\n filterCounts: Record<DashboardStatusFilter, number>;\n filteredProjects: ProjectSummary[];\n activeProjects: ProjectSummary[];\n historyProjects: ProjectSummary[];\n\n // State\n statusFilter: DashboardStatusFilter;\n sortMode: DashboardSortMode;\n historyCollapsed: boolean;\n cardStatusFilter: RunStatus | \"all\";\n hasStaleRuns: boolean;\n\n // Catch-up mode\n catchUp: CatchUpState;\n\n // Actions\n setStatusFilter: (value: DashboardStatusFilter) => void;\n setSortMode: (value: DashboardSortMode | ((prev: DashboardSortMode) => DashboardSortMode)) => void;\n setHistoryCollapsed: (value: boolean | ((prev: boolean) => boolean)) => void;\n setDismissedFingerprint: (value: string | null | ((prev: string | null) => string | null)) => void;\n toggleMetricFilter: (filter: DashboardStatusFilter) => void;\n handleHideProject: (projectName: string) => void;\n}\n\nexport function useRunDashboard(): UseRunDashboardReturn {\n // Use a ref to bridge the circular dependency between useBatchedUpdates.onFlush\n // and the refresh function returned by useProjects.\n const refreshRef = useRef<() => void>(() => {});\n\n // Monitor SSE event rate and activate catch-up mode during bursts.\n // When catch-up is active, useProjects suppresses SSE-triggered refetches\n // so the UI stays calm until the user clicks \"refresh now\" or the burst subsides.\n const sseFilter = useCallback(\n (event: { type: string }) => event.type === \"update\" || event.type === \"new-run\",\n []\n );\n const catchUp = useBatchedUpdates({\n sseFilter,\n onFlush: () => refreshRef.current(),\n });\n\n const { projects, recentCompletionWindowMs, loading, error, refresh } = useProjects(\n 5000,\n catchUp.active\n );\n refreshRef.current = refresh;\n\n const [statusFilter, setStatusFilter] = useState<DashboardStatusFilter>(\"all\");\n const [sortMode, setSortMode] = usePersistedState<DashboardSortMode>(\"observer:sort-mode\", \"status\");\n const [dismissedFingerprint, setDismissedFingerprint] = usePersistedState<string | null>(\"banner-dismissed-fingerprint\", null);\n\n // Toggle filter from metric tile: clicking active filter clears it\n const toggleMetricFilter = useCallback((filter: DashboardStatusFilter) => {\n setStatusFilter((prev) => (prev === filter ? \"all\" : filter));\n }, []);\n\n const handleHideProject = useCallback((_projectName: string) => {\n refresh();\n }, [refresh]);\n\n // Aggregate metrics across all projects\n const metrics = useMemo<DashboardMetrics>(() => {\n const totalRuns = projects.reduce((s, p) => s + p.totalRuns, 0);\n const activeRuns = projects.reduce((s, p) => s + p.activeRuns, 0);\n const completedRuns = projects.reduce((s, p) => s + p.completedRuns, 0);\n const failedRuns = projects.reduce((s, p) => s + p.failedRuns, 0);\n const staleRuns = projects.reduce((s, p) => s + p.staleRuns, 0);\n const totalTasks = projects.reduce((s, p) => s + p.totalTasks, 0);\n const completedTasks = projects.reduce((s, p) => s + p.completedTasksAggregate, 0);\n return { totalRuns, activeRuns, completedRuns, failedRuns, staleRuns, totalTasks, completedTasks };\n }, [projects]);\n\n // Collect all breakpoint runs across all projects\n const allBreakpointRuns = useMemo<BreakpointRunInfo[]>(() => {\n return projects.flatMap((p) => p.breakpointRuns ?? []);\n }, [projects]);\n\n // Executive summary metrics for the banner\n const summaryMetrics = useMemo<ExecutiveSummaryMetrics>(() => ({\n totalProjects: projects.length,\n activeRuns: metrics.activeRuns,\n failedRuns: metrics.failedRuns,\n completedRuns: metrics.completedRuns,\n staleRuns: metrics.staleRuns,\n pendingBreakpoints: projects.reduce((s, p) => s + p.pendingBreakpoints, 0),\n }), [projects, metrics]);\n\n // Fingerprint for banner dismiss\n const bannerFingerprint = `${summaryMetrics.failedRuns}-${summaryMetrics.staleRuns}-${summaryMetrics.pendingBreakpoints}`;\n const bannerDismissed = dismissedFingerprint === bannerFingerprint;\n\n const filterCounts = useMemo(() => {\n return {\n all: metrics.totalRuns,\n waiting: metrics.activeRuns,\n stale: metrics.staleRuns,\n completed: metrics.completedRuns,\n failed: metrics.failedRuns,\n pending: 0,\n } as Record<DashboardStatusFilter, number>;\n }, [metrics]);\n\n // Filter projects by status counts\n const filteredProjects = useMemo(() => {\n if (statusFilter === \"all\") return projects;\n if (statusFilter === \"stale\") return projects.filter((p) => p.staleRuns > 0);\n return projects.filter((project) => {\n if (statusFilter === \"waiting\") return project.activeRuns > 0;\n if (statusFilter === \"completed\") return project.completedRuns > 0;\n if (statusFilter === \"failed\") return project.failedRuns > 0;\n return false;\n });\n }, [projects, statusFilter]);\n\n // Determine the status filter to pass to ProjectHealthCard\n const cardStatusFilter: RunStatus | \"all\" = statusFilter === \"stale\" ? \"all\" : statusFilter;\n\n // Split filtered projects into sections based on sort mode\n const { activeProjects, historyProjects } = useMemo(() => {\n const now = Date.now();\n if (sortMode === \"activity\") {\n const twentyFourHours = 24 * 60 * 60 * 1000;\n const recent = filteredProjects.filter((p) =>\n now - new Date(p.latestUpdate).getTime() < twentyFourHours\n );\n const earlier = filteredProjects.filter((p) =>\n now - new Date(p.latestUpdate).getTime() >= twentyFourHours\n );\n return { activeProjects: recent, historyProjects: earlier };\n }\n const active = filteredProjects.filter((p) =>\n p.activeRuns > 0 || p.staleRuns > 0 ||\n (now - new Date(p.latestUpdate).getTime() < recentCompletionWindowMs)\n );\n const history = filteredProjects.filter((p) =>\n p.activeRuns === 0 && p.staleRuns === 0 &&\n (now - new Date(p.latestUpdate).getTime() >= recentCompletionWindowMs)\n );\n return { activeProjects: active, historyProjects: history };\n }, [filteredProjects, recentCompletionWindowMs, sortMode]);\n\n const [historyCollapsed, setHistoryCollapsed] = usePersistedState(\n \"observer:history-collapsed\",\n historyProjects.length > 5\n );\n\n const hasStaleRuns = metrics.staleRuns > 0;\n\n return {\n projects,\n loading,\n error,\n metrics,\n allBreakpointRuns,\n summaryMetrics,\n bannerFingerprint,\n bannerDismissed,\n filterCounts,\n filteredProjects,\n activeProjects,\n historyProjects,\n statusFilter,\n sortMode,\n historyCollapsed,\n cardStatusFilter,\n hasStaleRuns,\n catchUp,\n setStatusFilter,\n setSortMode,\n setHistoryCollapsed,\n setDismissedFingerprint,\n toggleMetricFilter,\n handleHideProject,\n };\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"701a9493b87b22bd9e0bf63b5617d5bac85338a858\":{\"name\":\"approveBreakpoint\"}},\"packages/observer-dashboard/src/app/actions/approve-breakpoint.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_0=/*#__PURE__*/createServerReference(\"701a9493b87b22bd9e0bf63b5617d5bac85338a858\",callServer,void 0,findSourceMapURL,\"approveBreakpoint\");export{$$RSC_SERVER_ACTION_0 as approveBreakpoint};","\"use client\";\r\nimport { useState, useEffect, useLayoutEffect, useRef, useCallback, useTransition } from \"react\";\r\nimport Link from \"next/link\";\r\nimport { cn } from \"@/lib/cn\";\r\nimport { Hand, AlertTriangle, CheckCircle2, Check, X } from \"lucide-react\";\r\nimport { approveBreakpoint } from \"@/app/actions/approve-breakpoint\";\r\nimport type { BreakpointRunInfo } from \"@/types\";\r\n\r\ninterface ResolvedEntry {\r\n bp: BreakpointRunInfo;\r\n resolvedAt: number;\r\n}\r\n\r\nconst RESOLVED_DISPLAY_MS = 20000; // 20 seconds\r\nconst STALENESS_THRESHOLD_MS = 120000; // 2 minutes — if a breakpoint has been shown\r\n // continuously for this long, show a hint\r\nconst DISMISSED_KEY = \"observer:dismissed-breakpoints\";\r\n\r\n/** Inline approve button for a single breakpoint in the dashboard banner. */\r\nfunction BreakpointBannerItem({ bp, stale, onDismiss }: { bp: BreakpointRunInfo; stale: boolean; onDismiss?: () => void }) {\r\n const [isPending, startTransition] = useTransition();\r\n const [result, setResult] = useState<{ ok: boolean; msg?: string } | null>(null);\r\n\r\n const handleApprove = (e: React.MouseEvent) => {\r\n e.preventDefault(); // Don't navigate via the Link\r\n e.stopPropagation();\r\n startTransition(async () => {\r\n const res = await approveBreakpoint(bp.runId, bp.effectId, \"Approved from dashboard\");\r\n setResult(res.success ? { ok: true } : { ok: false, msg: res.error });\r\n });\r\n };\r\n\r\n if (result?.ok) {\r\n return (\r\n <div className={cn(\r\n \"group relative flex items-center gap-3 px-4 py-3 rounded-lg\",\r\n \"bg-success-muted border border-success/30\",\r\n )}>\r\n <CheckCircle2 className=\"h-5 w-5 text-success shrink-0\" />\r\n <span className=\"text-sm text-success font-medium\">Approved — {bp.projectName}</span>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={cn(\r\n \"group relative flex items-center gap-3 px-4 py-3 rounded-lg\",\r\n \"bg-warning-muted border border-warning/30\",\r\n \"shadow-breakpoint-glow animate-breakpoint-glow\",\r\n stale && \"opacity-70\"\r\n )}>\r\n <Link href={`/runs/${bp.runId}`} className=\"flex items-center gap-3 flex-1 min-w-0\">\r\n <div className=\"relative shrink-0\">\r\n <Hand className=\"h-5 w-5 text-warning animate-pulse-dot\" />\r\n <span className=\"absolute -top-0.5 -right-0.5 h-2 w-2 rounded-full bg-warning animate-ping\" />\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2 mb-0.5\">\r\n <AlertTriangle className=\"h-3 w-3 text-warning shrink-0\" />\r\n <span className=\"text-xs font-bold text-warning uppercase tracking-wider\">\r\n Approval Needed\r\n </span>\r\n {stale && (\r\n <span className=\"text-xs text-foreground-muted italic\" data-testid=\"staleness-indicator\">\r\n (checking...)\r\n </span>\r\n )}\r\n <span className=\"text-xs text-foreground-muted font-medium\">\r\n {bp.projectName}\r\n </span>\r\n <span className=\"font-mono text-xs text-info\">\r\n {bp.runId.slice(0, 8)}\r\n </span>\r\n </div>\r\n <p className=\"text-sm text-foreground truncate\">\r\n {bp.breakpointQuestion}\r\n </p>\r\n </div>\r\n </Link>\r\n <button\r\n onClick={handleApprove}\r\n disabled={isPending || !bp.effectId}\r\n className={cn(\r\n \"shrink-0 flex items-center gap-1.5 px-3 py-1.5 rounded-md text-xs font-semibold\",\r\n \"bg-success/20 text-success border border-success/30\",\r\n \"hover:bg-success/30 hover:border-success/50\",\r\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\r\n \"transition-colors\"\r\n )}\r\n title=\"Approve this breakpoint\"\r\n >\r\n <Check className=\"h-3.5 w-3.5\" />\r\n {isPending ? \"Approving...\" : \"Approve\"}\r\n </button>\r\n {stale && onDismiss && (\r\n <button\r\n onClick={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n onDismiss();\r\n }}\r\n className={cn(\r\n \"shrink-0 p-1 rounded text-foreground-muted/50\",\r\n \"hover:text-foreground-muted hover:bg-foreground-muted/10\",\r\n \"transition-colors\"\r\n )}\r\n title=\"Dismiss this stale breakpoint\"\r\n data-testid=\"dismiss-breakpoint\"\r\n >\r\n <X className=\"h-3.5 w-3.5\" />\r\n </button>\r\n )}\r\n {result && !result.ok && (\r\n <span className=\"text-xs text-error ml-2\">{result.msg}</span>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\ninterface BreakpointBannerProps {\r\n breakpointRuns: BreakpointRunInfo[];\r\n}\r\n\r\nexport function BreakpointBanner({ breakpointRuns }: BreakpointBannerProps) {\r\n const [resolvedEntries, setResolvedEntries] = useState<ResolvedEntry[]>([]);\r\n const prevRunIdsRef = useRef<Map<string, BreakpointRunInfo>>(new Map());\r\n\r\n // Track when each breakpoint entry was first seen (by runId).\r\n // Entries are cleaned up when the breakpoint disappears from the list.\r\n const firstSeenRef = useRef<Map<string, number>>(new Map());\r\n\r\n // Dismissed stale breakpoints (client-side only, persisted in localStorage)\r\n // Start with empty set to match SSR, then read localStorage before paint.\r\n const [dismissedIds, setDismissedIds] = useState<Set<string>>(new Set());\r\n\r\n useLayoutEffect(() => {\r\n try {\r\n const raw = localStorage.getItem(DISMISSED_KEY);\r\n if (raw) {\r\n setDismissedIds(new Set(JSON.parse(raw) as string[]));\r\n }\r\n } catch {\r\n // localStorage unavailable\r\n }\r\n }, []);\r\n\r\n const dismissBreakpoint = useCallback((runId: string) => {\r\n setDismissedIds((prev) => {\r\n const next = new Set(prev);\r\n next.add(runId);\r\n try { localStorage.setItem(DISMISSED_KEY, JSON.stringify([...next])); } catch { /* noop */ }\r\n return next;\r\n });\r\n }, []);\r\n\r\n // Clean up dismissed IDs that are no longer in the breakpointRuns list\r\n useEffect(() => {\r\n const currentIds = new Set(breakpointRuns.map((bp) => bp.runId));\r\n setDismissedIds((prev) => {\r\n const cleaned = new Set([...prev].filter((id) => currentIds.has(id)));\r\n if (cleaned.size !== prev.size) {\r\n try { localStorage.setItem(DISMISSED_KEY, JSON.stringify([...cleaned])); } catch { /* noop */ }\r\n return cleaned;\r\n }\r\n return prev;\r\n });\r\n }, [breakpointRuns]);\r\n\r\n // State to trigger re-renders for staleness checks\r\n const [, setStalenessTick] = useState(0);\r\n\r\n // Detect resolved breakpoints: runs that were previously in the list but are now gone\r\n useEffect(() => {\r\n const currentIds = new Set(breakpointRuns.map((bp) => bp.runId));\r\n const now = Date.now();\r\n\r\n const newlyResolved: ResolvedEntry[] = [];\r\n for (const [runId, bp] of prevRunIdsRef.current) {\r\n if (!currentIds.has(runId)) {\r\n newlyResolved.push({ bp, resolvedAt: now });\r\n // Clean up first-seen tracking for resolved breakpoints\r\n firstSeenRef.current.delete(runId);\r\n }\r\n }\r\n\r\n if (newlyResolved.length > 0) {\r\n setResolvedEntries((prev) => [...prev, ...newlyResolved]);\r\n }\r\n\r\n // Record first-seen time for new breakpoints\r\n for (const bp of breakpointRuns) {\r\n if (!firstSeenRef.current.has(bp.runId)) {\r\n firstSeenRef.current.set(bp.runId, now);\r\n }\r\n }\r\n\r\n // Update prev ref\r\n prevRunIdsRef.current = new Map(breakpointRuns.map((bp) => [bp.runId, bp]));\r\n }, [breakpointRuns]);\r\n\r\n // Periodic tick to re-evaluate staleness (every 10s while breakpoints are active)\r\n useEffect(() => {\r\n if (breakpointRuns.length === 0) return;\r\n\r\n const timer = setInterval(() => {\r\n setStalenessTick((t) => t + 1);\r\n }, 10000);\r\n\r\n return () => clearInterval(timer);\r\n }, [breakpointRuns.length]);\r\n\r\n // Helper: check if a breakpoint has been shown for longer than the staleness threshold\r\n const isStale = useCallback((runId: string): boolean => {\r\n const firstSeen = firstSeenRef.current.get(runId);\r\n if (!firstSeen) return false;\r\n return Date.now() - firstSeen > STALENESS_THRESHOLD_MS;\r\n }, []);\r\n\r\n // Auto-cleanup expired resolved entries\r\n useEffect(() => {\r\n if (resolvedEntries.length === 0) return;\r\n\r\n const timer = setInterval(() => {\r\n const now = Date.now();\r\n setResolvedEntries((prev) =>\r\n prev.filter((entry) => now - entry.resolvedAt < RESOLVED_DISPLAY_MS)\r\n );\r\n }, 1000);\r\n\r\n return () => clearInterval(timer);\r\n }, [resolvedEntries.length]);\r\n\r\n const visibleRuns = breakpointRuns.filter((bp) => !dismissedIds.has(bp.runId));\r\n const hasWaiting = visibleRuns.length > 0;\r\n const hasResolved = resolvedEntries.length > 0;\r\n\r\n if (!hasWaiting && !hasResolved) return null;\r\n\r\n return (\r\n <div role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\" className=\"flex flex-col gap-2 mb-6\" data-testid=\"breakpoint-banner\">\r\n {/* Active breakpoints waiting */}\r\n {visibleRuns.map((bp) => {\r\n const stale = isStale(bp.runId);\r\n return (\r\n <BreakpointBannerItem\r\n key={bp.runId}\r\n bp={bp}\r\n stale={stale}\r\n onDismiss={() => dismissBreakpoint(bp.runId)}\r\n />\r\n );\r\n })}\r\n\r\n {/* Recently resolved breakpoints — green transient display */}\r\n {resolvedEntries.map((entry) => (\r\n <Link\r\n key={`resolved-${entry.bp.runId}`}\r\n href={`/runs/${entry.bp.runId}`}\r\n className={cn(\r\n \"group relative flex items-center gap-3 px-4 py-3 rounded-lg\",\r\n \"bg-success-muted border border-success/30\",\r\n \"shadow-glow-success\",\r\n \"hover:border-success/50\",\r\n \"transition-colors cursor-pointer\"\r\n )}\r\n >\r\n <div className=\"relative shrink-0\">\r\n <CheckCircle2 className=\"h-5 w-5 text-success\" />\r\n </div>\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2 mb-0.5\">\r\n <CheckCircle2 className=\"h-3 w-3 text-success shrink-0\" />\r\n <span className=\"text-xs font-bold text-success uppercase tracking-wider\">\r\n Approved\r\n </span>\r\n <span className=\"text-xs text-foreground-muted font-medium\">\r\n {entry.bp.projectName}\r\n </span>\r\n <span className=\"font-mono text-xs text-info\">\r\n {entry.bp.runId.slice(0, 8)}\r\n </span>\r\n </div>\r\n <p className=\"text-sm text-foreground-muted truncate\">\r\n {entry.bp.breakpointQuestion}\r\n </p>\r\n </div>\r\n </Link>\r\n ))}\r\n\r\n {/* Summary count when multiple waiting breakpoints */}\r\n {visibleRuns.length > 1 && (\r\n <div className=\"flex items-center gap-2 px-3 py-1\">\r\n <Hand className=\"h-3.5 w-3.5 text-warning\" />\r\n <span className=\"text-xs font-semibold text-warning\">\r\n {visibleRuns.length} approvals pending\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\nimport { RefreshCw, Inbox } from \"lucide-react\";\nimport { cn } from \"@/lib/cn\";\nimport type { CatchUpState } from \"@/hooks/use-batched-updates\";\n\n/** Lightweight snapshot of dashboard KPIs shown inside the catch-up banner. */\nexport interface CatchUpSummary {\n failedRuns: number;\n completedRuns: number;\n pendingBreakpoints: number;\n}\n\nexport interface CatchUpBannerProps {\n catchUp: CatchUpState;\n /** Optional summary metrics to give the user quick context about what happened. */\n summary?: CatchUpSummary;\n}\n\n/**\n * Builds a concise, human-readable summary string from dashboard metrics.\n * Returns null when there is nothing noteworthy to report.\n */\nfunction buildSummaryText(summary: CatchUpSummary | undefined): string | null {\n if (!summary) return null;\n const parts: string[] = [];\n if (summary.failedRuns > 0) {\n parts.push(`${summary.failedRuns} failed`);\n }\n if (summary.pendingBreakpoints > 0) {\n parts.push(`${summary.pendingBreakpoints} awaiting input`);\n }\n if (summary.completedRuns > 0) {\n parts.push(`${summary.completedRuns} completed`);\n }\n if (parts.length === 0) return null;\n return parts.join(\", \");\n}\n\n/**\n * Subtle notification shown when the dashboard detects a burst of SSE updates\n * (catch-up mode). Displays the number of buffered updates, an optional\n * summary of what happened, and a \"refresh now\" button to immediately apply\n * all pending changes.\n */\nexport function CatchUpBanner({ catchUp, summary }: CatchUpBannerProps) {\n if (!catchUp.active) return null;\n\n const summaryText = buildSummaryText(summary);\n\n return (\n <div\n data-testid=\"catch-up-banner\"\n className={cn(\n \"flex items-center gap-3 px-4 py-2.5 mb-4 rounded-lg\",\n \"bg-info-muted border border-info/20\",\n \"animate-in fade-in slide-in-from-top-2 duration-300\"\n )}\n >\n <div className=\"rounded-md p-1.5 bg-info/10\">\n <Inbox className=\"h-4 w-4 text-info\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm text-foreground\">\n <span className=\"font-semibold tabular-nums\">{catchUp.bufferedCount}</span>\n {\" \"}runs updated while you were away\n </p>\n {summaryText && (\n <p data-testid=\"catch-up-summary\" className=\"text-xs text-foreground-muted mt-0.5 truncate\">\n {summaryText}\n </p>\n )}\n </div>\n <button\n onClick={catchUp.flush}\n data-testid=\"catch-up-refresh-btn\"\n className={cn(\n \"inline-flex items-center gap-1.5 px-3 py-1.5 rounded-md text-xs font-semibold\",\n \"bg-info/10 border border-info/20 text-info\",\n \"hover:bg-info/20 transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-info/50\"\n )}\n >\n <RefreshCw className=\"h-3 w-3\" />\n Refresh now\n </button>\n </div>\n );\n}\n","\"use client\";\r\nimport { useMemo } from \"react\";\r\nimport { CheckCircle2, AlertTriangle, XCircle, X } from \"lucide-react\";\r\nimport { cn } from \"@/lib/cn\";\r\nimport type { RunStatus } from \"@/types\";\r\n\r\nexport interface ExecutiveSummaryMetrics {\r\n totalProjects: number;\r\n activeRuns: number;\r\n failedRuns: number;\r\n completedRuns: number;\r\n staleRuns: number;\r\n pendingBreakpoints: number;\r\n}\r\n\r\ntype SeverityLevel = \"healthy\" | \"amber\" | \"red\";\r\n\r\ninterface SummaryIssue {\r\n text: string;\r\n filter: RunStatus | \"stale\" | null;\r\n}\r\n\r\ninterface SummaryResult {\r\n severity: SeverityLevel;\r\n issues: SummaryIssue[];\r\n icon: React.ReactNode;\r\n}\r\n\r\nfunction deriveSummary(m: ExecutiveSummaryMetrics): SummaryResult {\r\n const issues: SummaryIssue[] = [];\r\n let severity: SeverityLevel = \"healthy\";\r\n\r\n // Red-level issues\r\n if (m.failedRuns > 0) {\r\n issues.push({\r\n text: `${m.failedRuns} run${m.failedRuns !== 1 ? \"s\" : \"\"} failing`,\r\n filter: \"failed\",\r\n });\r\n severity = \"red\";\r\n }\r\n\r\n // Amber-level issues\r\n if (m.pendingBreakpoints > 0) {\r\n issues.push({\r\n text: `${m.pendingBreakpoints} approval${m.pendingBreakpoints !== 1 ? \"s\" : \"\"} need${m.pendingBreakpoints === 1 ? \"s\" : \"\"} your attention`,\r\n filter: \"waiting\",\r\n });\r\n if (severity !== \"red\") severity = \"amber\";\r\n }\r\n\r\n if (m.staleRuns > 0) {\r\n issues.push({\r\n text: `${m.staleRuns} stale run${m.staleRuns !== 1 ? \"s\" : \"\"}`,\r\n filter: \"stale\",\r\n });\r\n if (severity !== \"red\") severity = \"amber\";\r\n }\r\n\r\n // Healthy\r\n if (issues.length === 0) {\r\n const projectLabel = m.totalProjects === 1 ? \"project\" : \"projects\";\r\n const text =\r\n m.activeRuns > 0\r\n ? `All ${m.totalProjects} ${projectLabel} healthy \\u2014 ${m.activeRuns} run${m.activeRuns !== 1 ? \"s\" : \"\"} in progress`\r\n : `All ${m.totalProjects} ${projectLabel} healthy`;\r\n return {\r\n severity: \"healthy\",\r\n issues: [{ text, filter: null }],\r\n icon: <CheckCircle2 className=\"h-4 w-4 shrink-0\" aria-hidden=\"true\" />,\r\n };\r\n }\r\n\r\n const icon =\r\n severity === \"red\" ? (\r\n <XCircle className=\"h-4 w-4 shrink-0\" aria-hidden=\"true\" />\r\n ) : (\r\n <AlertTriangle className=\"h-4 w-4 shrink-0\" aria-hidden=\"true\" />\r\n );\r\n\r\n return { severity, issues, icon };\r\n}\r\n\r\nconst severityStyles: Record<\r\n SeverityLevel,\r\n { container: string; text: string; iconColor: string }\r\n> = {\r\n healthy: {\r\n container:\r\n \"border-success/25 bg-success-muted shadow-neon-glow-success-sm\",\r\n text: \"text-success\",\r\n iconColor: \"text-success\",\r\n },\r\n amber: {\r\n container:\r\n \"border-warning/25 bg-warning-muted shadow-neon-glow-warning-sm\",\r\n text: \"text-warning\",\r\n iconColor: \"text-warning\",\r\n },\r\n red: {\r\n container: \"border-error/25 bg-error-muted shadow-neon-glow-error-sm\",\r\n text: \"text-error\",\r\n iconColor: \"text-error\",\r\n },\r\n};\r\n\r\ninterface ExecutiveSummaryBannerProps {\r\n metrics: ExecutiveSummaryMetrics;\r\n onFilterChange?: (filter: RunStatus | \"stale\") => void;\r\n dismissed?: boolean;\r\n onDismiss?: () => void;\r\n}\r\n\r\nexport function ExecutiveSummaryBanner({\r\n metrics,\r\n onFilterChange,\r\n dismissed,\r\n onDismiss,\r\n}: ExecutiveSummaryBannerProps) {\r\n const summary = useMemo(() => deriveSummary(metrics), [metrics]);\r\n const styles = severityStyles[summary.severity];\r\n\r\n if (dismissed) return null;\r\n\r\n return (\r\n <div\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n aria-atomic=\"true\"\r\n data-testid=\"executive-summary-banner\"\r\n className={cn(\n \"flex items-center gap-2.5 rounded-xl border px-4 py-3 mb-6 shadow-sm transition-all duration-300\",\n styles.container\n )}\n >\r\n <span className={styles.iconColor}>{summary.icon}</span>\r\n <p\r\n className={cn(\r\n \"text-sm font-medium leading-snug flex-1\",\r\n styles.text\r\n )}\r\n >\r\n {summary.issues.map((issue, i) => (\r\n <span key={i}>\r\n {i > 0 && \", \"}\r\n {issue.filter && onFilterChange ? (\r\n <button\r\n onClick={() => onFilterChange(issue.filter!)}\r\n className=\"underline decoration-dotted underline-offset-2 hover:decoration-solid transition-all\"\r\n >\r\n {issue.text}\r\n </button>\r\n ) : (\r\n issue.text\r\n )}\r\n </span>\r\n ))}\r\n </p>\r\n {summary.severity !== \"healthy\" && onDismiss && (\r\n <button\r\n data-testid=\"executive-summary-dismiss\"\r\n onClick={onDismiss}\r\n className={cn(\r\n \"rounded-md p-1.5 min-h-[44px] min-w-[44px] flex items-center justify-center transition-colors\",\r\n styles.iconColor,\r\n \"opacity-60 hover:opacity-100\"\r\n )}\r\n aria-label=\"Dismiss banner\"\r\n >\r\n <X className=\"h-3.5 w-3.5\" />\r\n </button>\r\n )}\r\n </div>\r\n );\r\n}\r\n","'use client';\r\nimport { useSmartPolling } from './use-smart-polling';\r\nimport { ProjectSummary } from '@/types';\r\n\r\ninterface ProjectsResponse {\r\n projects: ProjectSummary[];\r\n recentCompletionWindowMs?: number;\r\n}\r\n\r\nexport function useProjects(interval: number = 5000, suppressSseRefetch: boolean = false) {\r\n const { data, loading, error, refresh } = useSmartPolling<ProjectsResponse>(\r\n '/api/runs?mode=projects',\r\n {\r\n interval,\r\n sseFilter: (event) => event.type === 'update' || event.type === 'new-run',\r\n suppressSseRefetch,\r\n }\r\n );\r\n return {\r\n projects: data?.projects || [],\r\n recentCompletionWindowMs: data?.recentCompletionWindowMs ?? 14400000,\r\n loading,\r\n error,\r\n refresh\r\n };\r\n}\r\n","\"use client\";\nimport { useState, useEffect, useRef, useCallback } from \"react\";\n\n/**\n * Hook that smoothly animates a number from its previous value to the target.\n * Uses requestAnimationFrame for smooth 60fps transitions.\n *\n * @param target - The number to animate towards\n * @param duration - Animation duration in ms (default 600)\n * @returns The current animated value (integer)\n */\nexport function useAnimatedNumber(target: number, duration = 600): number {\n const [display, setDisplay] = useState(target);\n const animRef = useRef<number | null>(null);\n const startRef = useRef<{ value: number; time: number } | null>(null);\n const targetRef = useRef(target);\n const displayRef = useRef(target);\n\n // Easing function: ease-out cubic for a natural deceleration feel\n const easeOutCubic = useCallback((t: number): number => {\n return 1 - Math.pow(1 - t, 3);\n }, []);\n\n useEffect(() => {\n const prevTarget = targetRef.current;\n targetRef.current = target;\n\n // No change — skip animation\n if (prevTarget === target) return;\n\n // Cancel any running animation\n if (animRef.current !== null) {\n cancelAnimationFrame(animRef.current);\n animRef.current = null;\n }\n\n const startValue = displayRef.current;\n const diff = target - startValue;\n\n // If diff is 0, just snap\n if (diff === 0) {\n setDisplay(target);\n displayRef.current = target;\n return;\n }\n\n // For very small changes (1-2), snap immediately\n if (Math.abs(diff) <= 2) {\n setDisplay(target);\n displayRef.current = target;\n return;\n }\n\n const startTime = performance.now();\n startRef.current = { value: startValue, time: startTime };\n\n function animate(now: number) {\n const elapsed = now - startTime;\n const progress = Math.min(elapsed / duration, 1);\n const easedProgress = easeOutCubic(progress);\n\n const current = Math.round(startValue + diff * easedProgress);\n displayRef.current = current;\n setDisplay(current);\n\n if (progress < 1) {\n animRef.current = requestAnimationFrame(animate);\n } else {\n animRef.current = null;\n // Ensure we land exactly on target\n displayRef.current = target;\n setDisplay(target);\n }\n }\n\n animRef.current = requestAnimationFrame(animate);\n\n return () => {\n if (animRef.current !== null) {\n cancelAnimationFrame(animRef.current);\n animRef.current = null;\n }\n };\n }, [target, duration, easeOutCubic]);\n\n return display;\n}\n","\"use client\";\nimport {\n Layers,\n Activity,\n CheckCircle2,\n AlertCircle,\n Pause,\n} from \"lucide-react\";\nimport { cn } from \"@/lib/cn\";\nimport { useAnimatedNumber } from \"@/hooks/use-animated-number\";\nimport type { DashboardMetrics, DashboardStatusFilter } from \"@/hooks/use-run-dashboard\";\n\n// ---------------------------------------------------------------------------\n// MetricTile (internal)\n// ---------------------------------------------------------------------------\n\ninterface MetricTileProps {\n label: string;\n value: number;\n icon: React.ReactNode;\n color: \"primary\" | \"success\" | \"warning\" | \"error\" | \"muted\";\n pulse?: boolean;\n testId?: string;\n active?: boolean;\n onClick?: () => void;\n}\n\nconst colorMap: Record<MetricTileProps[\"color\"], { text: string; bg: string; glow: string; borderL: string; ring: string }> = {\n primary: { text: \"text-primary\", bg: \"bg-primary/10\", glow: \"shadow-neon-glow-primary-xs\", borderL: \"\", ring: \"ring-primary/50\" },\n success: { text: \"text-success\", bg: \"bg-success/10\", glow: \"shadow-neon-glow-success-sm\", borderL: \"border-l-success/60\", ring: \"ring-success/50\" },\n warning: { text: \"text-warning\", bg: \"bg-warning/10\", glow: \"shadow-neon-glow-warning-sm\", borderL: \"border-l-warning/60\", ring: \"ring-warning/50\" },\n error: { text: \"text-error\", bg: \"bg-error/10\", glow: \"shadow-neon-glow-error-sm\", borderL: \"border-l-error/60\", ring: \"ring-error/50\" },\n muted: { text: \"text-zinc-500\", bg: \"bg-zinc-500/10\", glow: \"\", borderL: \"border-l-zinc-500/60\", ring: \"ring-zinc-500/50\" },\n};\n\nfunction MetricTile({ label, value, icon, color, pulse, testId, active, onClick }: MetricTileProps) {\n const c = colorMap[color];\n const isClickable = !!onClick;\n // Animate the number so jumps like 48->91 feel smooth instead of jarring\n const displayValue = useAnimatedNumber(value);\n return (\n <div\n data-testid={testId}\n role={isClickable ? \"button\" : undefined}\n aria-pressed={isClickable ? !!active : undefined}\n tabIndex={isClickable ? 0 : undefined}\n onClick={onClick}\n onKeyDown={isClickable ? (e) => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); onClick?.(); } } : undefined}\n className={cn(\n \"rounded-xl border border-border bg-card/90 p-3 flex items-center gap-3 transition-all shadow-sm\",\n value > 0 && color !== \"primary\" && \"border-l-2\",\n value > 0 && color !== \"primary\" && c.borderL,\n c.glow,\n isClickable && \"cursor-pointer hover:bg-background-secondary/65 hover:shadow-md\",\n active && \"ring-2\",\n active && c.ring,\n )}\n >\n <div className={cn(\"rounded-md p-2\", c.bg)}>\n <span className={cn(c.text, pulse && \"animate-pulse-dot\")}>{icon}</span>\n </div>\n <div>\n <p className={cn(\"text-lg font-bold tabular-nums leading-none mb-0.5\", c.text)}>\n {displayValue}\n </p>\n <p className=\"text-[11px] leading-tight text-foreground-muted uppercase tracking-[0.12em] font-medium\">\n {label}\n </p>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// KpiGrid (public)\n// ---------------------------------------------------------------------------\n\nexport interface KpiGridProps {\n metrics: DashboardMetrics;\n statusFilter: DashboardStatusFilter;\n hasStaleRuns: boolean;\n onToggleFilter: (filter: DashboardStatusFilter) => void;\n}\n\nexport function KpiGrid({ metrics, statusFilter, hasStaleRuns, onToggleFilter }: KpiGridProps) {\n const kpiCols = hasStaleRuns ? \"grid-cols-2 sm:grid-cols-5\" : \"grid-cols-2 sm:grid-cols-4\";\n\n return (\n <div data-testid=\"kpi-grid\" aria-live=\"polite\" aria-label=\"Key metrics\" className={cn(\"grid gap-3 mb-6\", kpiCols)}>\n <MetricTile\n label=\"Total Runs\"\n value={metrics.totalRuns}\n icon={<Layers className=\"h-4 w-4\" />}\n color=\"primary\"\n testId=\"metric-tile-total-runs\"\n onClick={() => onToggleFilter(\"all\")}\n active={statusFilter === \"all\"}\n />\n <MetricTile\n label=\"In Progress\"\n value={metrics.activeRuns}\n icon={<Activity className=\"h-4 w-4\" />}\n color=\"warning\"\n pulse={metrics.activeRuns > 0}\n testId=\"metric-tile-active\"\n onClick={() => onToggleFilter(\"waiting\")}\n active={statusFilter === \"waiting\"}\n />\n {hasStaleRuns && (\n <MetricTile\n label=\"Stale\"\n value={metrics.staleRuns}\n icon={<Pause className=\"h-4 w-4\" />}\n color=\"muted\"\n testId=\"metric-tile-stale\"\n onClick={() => onToggleFilter(\"stale\")}\n active={statusFilter === \"stale\"}\n />\n )}\n <MetricTile\n label=\"Completed\"\n value={metrics.completedRuns}\n icon={<CheckCircle2 className=\"h-4 w-4\" />}\n color=\"success\"\n testId=\"metric-tile-completed\"\n onClick={() => onToggleFilter(\"completed\")}\n active={statusFilter === \"completed\"}\n />\n <MetricTile\n label=\"Failed\"\n value={metrics.failedRuns}\n icon={<AlertCircle className=\"h-4 w-4\" />}\n color=\"error\"\n testId=\"metric-tile-failed\"\n onClick={() => onToggleFilter(\"failed\")}\n active={statusFilter === \"failed\"}\n />\n </div>\n );\n}\n","\"use client\";\nimport { ArrowUpDown, Clock } from \"lucide-react\";\nimport { cn } from \"@/lib/cn\";\nimport type { DashboardSortMode, DashboardStatusFilter } from \"@/hooks/use-run-dashboard\";\n\nconst filters: { label: string; value: DashboardStatusFilter }[] = [\n { label: \"All\", value: \"all\" },\n { label: \"Running\", value: \"waiting\" },\n { label: \"Stale\", value: \"stale\" },\n { label: \"Completed\", value: \"completed\" },\n { label: \"Failed\", value: \"failed\" },\n];\n\nexport interface RunFilterBarProps {\n statusFilter: DashboardStatusFilter;\n onStatusFilterChange: (value: DashboardStatusFilter) => void;\n filterCounts: Record<DashboardStatusFilter, number>;\n sortMode: DashboardSortMode;\n onSortModeToggle: () => void;\n filteredProjectCount: number;\n}\n\nexport function RunFilterBar({\n statusFilter,\n onStatusFilterChange,\n filterCounts,\n sortMode,\n onSortModeToggle,\n filteredProjectCount,\n}: RunFilterBarProps) {\n return (\n <div className=\"mb-5\">\n <div data-testid=\"filter-bar\" className=\"flex items-center gap-1\">\n {filters.map((f) => {\n const count = filterCounts[f.value] ?? 0;\n // Hide Stale filter pill when there are no stale runs\n if (f.value === \"stale\" && count === 0) return null;\n return (\n <button\n key={f.value}\n data-testid={`filter-pill-${f.value}`}\n aria-pressed={statusFilter === f.value}\n onClick={() => onStatusFilterChange(f.value)}\n className={cn(\n \"rounded-md px-3 py-1.5 min-h-[44px] text-xs font-medium transition-all inline-flex items-center gap-1.5\",\n statusFilter === f.value\n ? f.value === \"stale\"\n ? \"bg-zinc-500/10 text-zinc-500\"\n : \"bg-primary/10 text-primary shadow-neon-glow-primary-xs\"\n : \"text-foreground-muted hover:text-foreground-secondary hover:bg-background-secondary\"\n )}\n >\n {f.label}\n {count > 0 && (\n <span className={cn(\n \"rounded-full px-1.5 py-px text-xs leading-tight font-semibold tabular-nums\",\n statusFilter === f.value\n ? f.value === \"stale\"\n ? \"bg-zinc-500/20 text-zinc-500\"\n : \"bg-primary/20 text-primary\"\n : \"bg-background-secondary text-foreground-muted\"\n )}>\n {count}\n </span>\n )}\n </button>\n );\n })}\n {/* Sort toggle + Project count */}\n <div className=\"ml-auto flex items-center gap-2\">\n <button\n data-testid=\"sort-toggle\"\n onClick={onSortModeToggle}\n className={cn(\n \"rounded-md px-2.5 py-1.5 min-h-[44px] text-xs font-medium inline-flex items-center gap-1.5\",\n \"transition-all duration-200 ease-in-out\",\n sortMode === \"status\"\n ? \"bg-warning/10 border border-warning/30 text-warning hover:bg-warning/15 hover:border-warning/40 shadow-sm\"\n : \"bg-primary/10 border border-primary/30 text-primary hover:bg-primary/15 hover:border-primary/40 shadow-sm\"\n )}\n title={sortMode === \"status\"\n ? \"Currently sorting by status priority (active first, then failed, then completed). Click to switch to chronological activity view.\"\n : \"Currently sorting by most recent activity (newest updates first). Click to switch to status-grouped view.\"\n }\n >\n {sortMode === \"status\" ? (\n <ArrowUpDown className=\"h-3 w-3 transition-transform duration-200\" />\n ) : (\n <Clock className=\"h-3 w-3 transition-transform duration-200\" />\n )}\n {sortMode === \"status\" ? \"By Status\" : \"By Activity\"}\n </button>\n <span data-testid=\"project-count\" className=\"text-xs text-foreground-muted tabular-nums\">\n {filteredProjectCount} project{filteredProjectCount !== 1 ? \"s\" : \"\"}\n </span>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * Copyright 2022 Joe Bell. All rights reserved.\n *\n * This file is licensed to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR REPRESENTATIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */ import { clsx } from \"clsx\";\nconst falsyToString = (value)=>typeof value === \"boolean\" ? `${value}` : value === 0 ? \"0\" : value;\nexport const cx = clsx;\nexport const cva = (base, config)=>(props)=>{\n var _config_compoundVariants;\n if ((config === null || config === void 0 ? void 0 : config.variants) == null) return cx(base, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);\n const { variants, defaultVariants } = config;\n const getVariantClassNames = Object.keys(variants).map((variant)=>{\n const variantProp = props === null || props === void 0 ? void 0 : props[variant];\n const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant];\n if (variantProp === null) return null;\n const variantKey = falsyToString(variantProp) || falsyToString(defaultVariantProp);\n return variants[variant][variantKey];\n });\n const propsWithoutUndefined = props && Object.entries(props).reduce((acc, param)=>{\n let [key, value] = param;\n if (value === undefined) {\n return acc;\n }\n acc[key] = value;\n return acc;\n }, {});\n const getCompoundVariantClassNames = config === null || config === void 0 ? void 0 : (_config_compoundVariants = config.compoundVariants) === null || _config_compoundVariants === void 0 ? void 0 : _config_compoundVariants.reduce((acc, param)=>{\n let { class: cvClass, className: cvClassName, ...compoundVariantOptions } = param;\n return Object.entries(compoundVariantOptions).every((param)=>{\n let [key, value] = param;\n return Array.isArray(value) ? value.includes({\n ...defaultVariants,\n ...propsWithoutUndefined\n }[key]) : ({\n ...defaultVariants,\n ...propsWithoutUndefined\n })[key] === value;\n }) ? [\n ...acc,\n cvClass,\n cvClassName\n ] : acc;\n }, []);\n return cx(base, getVariantClassNames, getCompoundVariantClassNames, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);\n };\n\n","/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n x: v,\n y: v\n});\nconst oppositeSideMap = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nfunction clamp(start, value, end) {\n return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\nfunction getSideAxis(placement) {\n const firstChar = placement[0];\n return firstChar === 't' || firstChar === 'b' ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n const alignment = getAlignment(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const length = getAxisLength(alignmentAxis);\n let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.includes('start') ? placement.replace('start', 'end') : placement.replace('end', 'start');\n}\nconst lrPlacement = ['left', 'right'];\nconst rlPlacement = ['right', 'left'];\nconst tbPlacement = ['top', 'bottom'];\nconst btPlacement = ['bottom', 'top'];\nfunction getSideList(side, isStart, rtl) {\n switch (side) {\n case 'top':\n case 'bottom':\n if (rtl) return isStart ? rlPlacement : lrPlacement;\n return isStart ? lrPlacement : rlPlacement;\n case 'left':\n case 'right':\n return isStart ? tbPlacement : btPlacement;\n default:\n return [];\n }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n const alignment = getAlignment(placement);\n let list = getSideList(getSide(placement), direction === 'start', rtl);\n if (alignment) {\n list = list.map(side => side + \"-\" + alignment);\n if (flipAlignment) {\n list = list.concat(list.map(getOppositeAlignmentPlacement));\n }\n }\n return list;\n}\nfunction getOppositePlacement(placement) {\n const side = getSide(placement);\n return oppositeSideMap[side] + placement.slice(side.length);\n}\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\nfunction getPaddingObject(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\nfunction rectToClientRect(rect) {\n const {\n x,\n y,\n width,\n height\n } = rect;\n return {\n width,\n height,\n top: y,\n left: x,\n right: x + width,\n bottom: y + height,\n x,\n y\n };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n","function hasWindow() {\n return typeof window !== 'undefined';\n}\nfunction getNodeName(node) {\n if (isNode(node)) {\n return (node.nodeName || '').toLowerCase();\n }\n // Mocked nodes in testing environments may not be instances of Node. By\n // returning `#document` an infinite loop won't occur.\n // https://github.com/floating-ui/floating-ui/issues/2317\n return '#document';\n}\nfunction getWindow(node) {\n var _node$ownerDocument;\n return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n var _ref;\n return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n if (!hasWindow() || typeof ShadowRoot === 'undefined') {\n return false;\n }\n return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nfunction isOverflowElement(element) {\n const {\n overflow,\n overflowX,\n overflowY,\n display\n } = getComputedStyle(element);\n return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && display !== 'inline' && display !== 'contents';\n}\nfunction isTableElement(element) {\n return /^(table|td|th)$/.test(getNodeName(element));\n}\nfunction isTopLayer(element) {\n try {\n if (element.matches(':popover-open')) {\n return true;\n }\n } catch (_e) {\n // no-op\n }\n try {\n return element.matches(':modal');\n } catch (_e) {\n return false;\n }\n}\nconst willChangeRe = /transform|translate|scale|rotate|perspective|filter/;\nconst containRe = /paint|layout|strict|content/;\nconst isNotNone = value => !!value && value !== 'none';\nlet isWebKitValue;\nfunction isContainingBlock(elementOrCss) {\n const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n // https://drafts.csswg.org/css-transforms-2/#individual-transforms\n return isNotNone(css.transform) || isNotNone(css.translate) || isNotNone(css.scale) || isNotNone(css.rotate) || isNotNone(css.perspective) || !isWebKit() && (isNotNone(css.backdropFilter) || isNotNone(css.filter)) || willChangeRe.test(css.willChange || '') || containRe.test(css.contain || '');\n}\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else if (isTopLayer(currentNode)) {\n return null;\n }\n currentNode = getParentNode(currentNode);\n }\n return null;\n}\nfunction isWebKit() {\n if (isWebKitValue == null) {\n isWebKitValue = typeof CSS !== 'undefined' && CSS.supports && CSS.supports('-webkit-backdrop-filter', 'none');\n }\n return isWebKitValue;\n}\nfunction isLastTraversableNode(node) {\n return /^(html|body|#document)$/.test(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n return {\n scrollLeft: element.scrollX,\n scrollTop: element.scrollY\n };\n}\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n const result =\n // Step into the shadow DOM of the parent of a slotted node.\n node.assignedSlot ||\n // DOM Element detected.\n node.parentNode ||\n // ShadowRoot detected.\n isShadowRoot(node) && node.host ||\n // Fallback.\n getDocumentElement(node);\n return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n if (isLastTraversableNode(parentNode)) {\n return node.ownerDocument ? node.ownerDocument.body : node.body;\n }\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n var _node$ownerDocument2;\n if (list === void 0) {\n list = [];\n }\n if (traverseIframes === void 0) {\n traverseIframes = true;\n }\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n const win = getWindow(scrollableAncestor);\n if (isBody) {\n const frameElement = getFrameElement(win);\n return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n } else {\n return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n }\n}\nfunction getFrameElement(win) {\n return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n","\"use client\";\r\nimport { useRunDashboard } from \"@/hooks/use-run-dashboard\";\r\nimport { BreakpointBanner } from \"@/components/dashboard/breakpoint-banner\";\r\nimport { CatchUpBanner } from \"@/components/dashboard/catch-up-banner\";\r\nimport { ExecutiveSummaryBanner } from \"@/components/dashboard/executive-summary-banner\";\r\nimport { KpiGrid } from \"@/components/dashboard/kpi-grid\";\r\nimport { RunFilterBar } from \"@/components/dashboard/run-filter-bar\";\r\nimport { ProjectListView } from \"@/components/dashboard/project-list-view\";\r\nimport { ErrorBoundary } from \"@/components/shared/error-boundary\";\r\nimport { GlobalSearch } from \"@/components/dashboard/global-search\";\r\n\r\nexport default function DashboardPage() {\r\n const {\r\n projects,\r\n loading,\r\n error,\r\n metrics,\r\n allBreakpointRuns,\r\n summaryMetrics,\r\n bannerFingerprint,\r\n bannerDismissed,\r\n filterCounts,\r\n filteredProjects,\r\n activeProjects,\r\n historyProjects,\r\n statusFilter,\r\n sortMode,\r\n historyCollapsed,\r\n cardStatusFilter,\r\n hasStaleRuns,\r\n catchUp,\r\n setStatusFilter,\r\n setSortMode,\r\n setHistoryCollapsed,\r\n setDismissedFingerprint,\r\n toggleMetricFilter,\r\n handleHideProject,\r\n } = useRunDashboard();\r\n\r\n const showBanners = !loading && !error && projects.length > 0;\r\n\r\n return (\r\n <div className=\"bg-gradient-brand flex-1\">\r\n <div className=\"mx-auto max-w-[1600px] px-6 py-6\">\r\n {/* Global Search */}\r\n <GlobalSearch />\r\n\r\n {/* Executive Summary Banner */}\r\n {showBanners && (\r\n <ErrorBoundary section=\"Executive Summary\">\r\n <ExecutiveSummaryBanner\r\n metrics={summaryMetrics}\r\n onFilterChange={setStatusFilter}\r\n dismissed={bannerDismissed}\r\n onDismiss={() => setDismissedFingerprint(bannerFingerprint)}\r\n />\r\n </ErrorBoundary>\r\n )}\r\n\r\n {/* KPI Metrics Row */}\r\n {showBanners && (\r\n <ErrorBoundary section=\"KPI Metrics\">\r\n <KpiGrid\r\n metrics={metrics}\r\n statusFilter={statusFilter}\r\n hasStaleRuns={hasStaleRuns}\r\n onToggleFilter={toggleMetricFilter}\r\n />\r\n </ErrorBoundary>\r\n )}\r\n\r\n {/* Catch-up mode banner — shown when burst of SSE updates detected */}\r\n {catchUp.active && (\r\n <CatchUpBanner\r\n catchUp={catchUp}\r\n summary={{\r\n failedRuns: summaryMetrics.failedRuns,\r\n completedRuns: summaryMetrics.completedRuns,\r\n pendingBreakpoints: summaryMetrics.pendingBreakpoints,\r\n }}\r\n />\r\n )}\r\n\r\n {/* Global Breakpoint Banner — pinned with sticky positioning */}\r\n {!loading && !error && allBreakpointRuns.length > 0 && (\r\n <ErrorBoundary section=\"Breakpoint Banner\">\r\n <div className=\"sticky top-0 z-40\">\r\n <BreakpointBanner breakpointRuns={allBreakpointRuns} />\r\n </div>\r\n </ErrorBoundary>\r\n )}\r\n\r\n {/* Filter pills + sort toggle */}\r\n <RunFilterBar\r\n statusFilter={statusFilter}\r\n onStatusFilterChange={setStatusFilter}\r\n filterCounts={filterCounts}\r\n sortMode={sortMode}\r\n onSortModeToggle={() => setSortMode((prev) => prev === \"status\" ? \"activity\" : \"status\")}\r\n filteredProjectCount={filteredProjects.length}\r\n />\r\n\r\n {/* Project cards content */}\r\n <ProjectListView\r\n loading={loading}\r\n error={error}\r\n filteredProjects={filteredProjects}\r\n activeProjects={activeProjects}\r\n historyProjects={historyProjects}\r\n statusFilter={statusFilter}\r\n sortMode={sortMode}\r\n cardStatusFilter={cardStatusFilter}\r\n historyCollapsed={historyCollapsed}\r\n onHistoryCollapsedChange={setHistoryCollapsed}\r\n onHideProject={handleHideProject}\r\n />\r\n </div>\r\n </div>\r\n );\r\n}\r\n","\"use client\";\n\n// src/popper.tsx\nimport * as React from \"react\";\nimport {\n useFloating,\n autoUpdate,\n offset,\n shift,\n limitShift,\n hide,\n arrow as floatingUIarrow,\n flip,\n size\n} from \"@floating-ui/react-dom\";\nimport * as ArrowPrimitive from \"@radix-ui/react-arrow\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { useLayoutEffect } from \"@radix-ui/react-use-layout-effect\";\nimport { useSize } from \"@radix-ui/react-use-size\";\nimport { jsx } from \"react/jsx-runtime\";\nvar SIDE_OPTIONS = [\"top\", \"right\", \"bottom\", \"left\"];\nvar ALIGN_OPTIONS = [\"start\", \"center\", \"end\"];\nvar POPPER_NAME = \"Popper\";\nvar [createPopperContext, createPopperScope] = createContextScope(POPPER_NAME);\nvar [PopperProvider, usePopperContext] = createPopperContext(POPPER_NAME);\nvar Popper = (props) => {\n const { __scopePopper, children } = props;\n const [anchor, setAnchor] = React.useState(null);\n return /* @__PURE__ */ jsx(PopperProvider, { scope: __scopePopper, anchor, onAnchorChange: setAnchor, children });\n};\nPopper.displayName = POPPER_NAME;\nvar ANCHOR_NAME = \"PopperAnchor\";\nvar PopperAnchor = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopper, virtualRef, ...anchorProps } = props;\n const context = usePopperContext(ANCHOR_NAME, __scopePopper);\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const anchorRef = React.useRef(null);\n React.useEffect(() => {\n const previousAnchor = anchorRef.current;\n anchorRef.current = virtualRef?.current || ref.current;\n if (previousAnchor !== anchorRef.current) {\n context.onAnchorChange(anchorRef.current);\n }\n });\n return virtualRef ? null : /* @__PURE__ */ jsx(Primitive.div, { ...anchorProps, ref: composedRefs });\n }\n);\nPopperAnchor.displayName = ANCHOR_NAME;\nvar CONTENT_NAME = \"PopperContent\";\nvar [PopperContentProvider, useContentContext] = createPopperContext(CONTENT_NAME);\nvar PopperContent = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopePopper,\n side = \"bottom\",\n sideOffset = 0,\n align = \"center\",\n alignOffset = 0,\n arrowPadding = 0,\n avoidCollisions = true,\n collisionBoundary = [],\n collisionPadding: collisionPaddingProp = 0,\n sticky = \"partial\",\n hideWhenDetached = false,\n updatePositionStrategy = \"optimized\",\n onPlaced,\n ...contentProps\n } = props;\n const context = usePopperContext(CONTENT_NAME, __scopePopper);\n const [content, setContent] = React.useState(null);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setContent(node));\n const [arrow, setArrow] = React.useState(null);\n const arrowSize = useSize(arrow);\n const arrowWidth = arrowSize?.width ?? 0;\n const arrowHeight = arrowSize?.height ?? 0;\n const desiredPlacement = side + (align !== \"center\" ? \"-\" + align : \"\");\n const collisionPadding = typeof collisionPaddingProp === \"number\" ? collisionPaddingProp : { top: 0, right: 0, bottom: 0, left: 0, ...collisionPaddingProp };\n const boundary = Array.isArray(collisionBoundary) ? collisionBoundary : [collisionBoundary];\n const hasExplicitBoundaries = boundary.length > 0;\n const detectOverflowOptions = {\n padding: collisionPadding,\n boundary: boundary.filter(isNotNull),\n // with `strategy: 'fixed'`, this is the only way to get it to respect boundaries\n altBoundary: hasExplicitBoundaries\n };\n const { refs, floatingStyles, placement, isPositioned, middlewareData } = useFloating({\n // default to `fixed` strategy so users don't have to pick and we also avoid focus scroll issues\n strategy: \"fixed\",\n placement: desiredPlacement,\n whileElementsMounted: (...args) => {\n const cleanup = autoUpdate(...args, {\n animationFrame: updatePositionStrategy === \"always\"\n });\n return cleanup;\n },\n elements: {\n reference: context.anchor\n },\n middleware: [\n offset({ mainAxis: sideOffset + arrowHeight, alignmentAxis: alignOffset }),\n avoidCollisions && shift({\n mainAxis: true,\n crossAxis: false,\n limiter: sticky === \"partial\" ? limitShift() : void 0,\n ...detectOverflowOptions\n }),\n avoidCollisions && flip({ ...detectOverflowOptions }),\n size({\n ...detectOverflowOptions,\n apply: ({ elements, rects, availableWidth, availableHeight }) => {\n const { width: anchorWidth, height: anchorHeight } = rects.reference;\n const contentStyle = elements.floating.style;\n contentStyle.setProperty(\"--radix-popper-available-width\", `${availableWidth}px`);\n contentStyle.setProperty(\"--radix-popper-available-height\", `${availableHeight}px`);\n contentStyle.setProperty(\"--radix-popper-anchor-width\", `${anchorWidth}px`);\n contentStyle.setProperty(\"--radix-popper-anchor-height\", `${anchorHeight}px`);\n }\n }),\n arrow && floatingUIarrow({ element: arrow, padding: arrowPadding }),\n transformOrigin({ arrowWidth, arrowHeight }),\n hideWhenDetached && hide({ strategy: \"referenceHidden\", ...detectOverflowOptions })\n ]\n });\n const [placedSide, placedAlign] = getSideAndAlignFromPlacement(placement);\n const handlePlaced = useCallbackRef(onPlaced);\n useLayoutEffect(() => {\n if (isPositioned) {\n handlePlaced?.();\n }\n }, [isPositioned, handlePlaced]);\n const arrowX = middlewareData.arrow?.x;\n const arrowY = middlewareData.arrow?.y;\n const cannotCenterArrow = middlewareData.arrow?.centerOffset !== 0;\n const [contentZIndex, setContentZIndex] = React.useState();\n useLayoutEffect(() => {\n if (content) setContentZIndex(window.getComputedStyle(content).zIndex);\n }, [content]);\n return /* @__PURE__ */ jsx(\n \"div\",\n {\n ref: refs.setFloating,\n \"data-radix-popper-content-wrapper\": \"\",\n style: {\n ...floatingStyles,\n transform: isPositioned ? floatingStyles.transform : \"translate(0, -200%)\",\n // keep off the page when measuring\n minWidth: \"max-content\",\n zIndex: contentZIndex,\n [\"--radix-popper-transform-origin\"]: [\n middlewareData.transformOrigin?.x,\n middlewareData.transformOrigin?.y\n ].join(\" \"),\n // hide the content if using the hide middleware and should be hidden\n // set visibility to hidden and disable pointer events so the UI behaves\n // as if the PopperContent isn't there at all\n ...middlewareData.hide?.referenceHidden && {\n visibility: \"hidden\",\n pointerEvents: \"none\"\n }\n },\n dir: props.dir,\n children: /* @__PURE__ */ jsx(\n PopperContentProvider,\n {\n scope: __scopePopper,\n placedSide,\n onArrowChange: setArrow,\n arrowX,\n arrowY,\n shouldHideArrow: cannotCenterArrow,\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-side\": placedSide,\n \"data-align\": placedAlign,\n ...contentProps,\n ref: composedRefs,\n style: {\n ...contentProps.style,\n // if the PopperContent hasn't been placed yet (not all measurements done)\n // we prevent animations so that users's animation don't kick in too early referring wrong sides\n animation: !isPositioned ? \"none\" : void 0\n }\n }\n )\n }\n )\n }\n );\n }\n);\nPopperContent.displayName = CONTENT_NAME;\nvar ARROW_NAME = \"PopperArrow\";\nvar OPPOSITE_SIDE = {\n top: \"bottom\",\n right: \"left\",\n bottom: \"top\",\n left: \"right\"\n};\nvar PopperArrow = React.forwardRef(function PopperArrow2(props, forwardedRef) {\n const { __scopePopper, ...arrowProps } = props;\n const contentContext = useContentContext(ARROW_NAME, __scopePopper);\n const baseSide = OPPOSITE_SIDE[contentContext.placedSide];\n return (\n // we have to use an extra wrapper because `ResizeObserver` (used by `useSize`)\n // doesn't report size as we'd expect on SVG elements.\n // it reports their bounding box which is effectively the largest path inside the SVG.\n /* @__PURE__ */ jsx(\n \"span\",\n {\n ref: contentContext.onArrowChange,\n style: {\n position: \"absolute\",\n left: contentContext.arrowX,\n top: contentContext.arrowY,\n [baseSide]: 0,\n transformOrigin: {\n top: \"\",\n right: \"0 0\",\n bottom: \"center 0\",\n left: \"100% 0\"\n }[contentContext.placedSide],\n transform: {\n top: \"translateY(100%)\",\n right: \"translateY(50%) rotate(90deg) translateX(-50%)\",\n bottom: `rotate(180deg)`,\n left: \"translateY(50%) rotate(-90deg) translateX(50%)\"\n }[contentContext.placedSide],\n visibility: contentContext.shouldHideArrow ? \"hidden\" : void 0\n },\n children: /* @__PURE__ */ jsx(\n ArrowPrimitive.Root,\n {\n ...arrowProps,\n ref: forwardedRef,\n style: {\n ...arrowProps.style,\n // ensures the element can be measured correctly (mostly for if SVG)\n display: \"block\"\n }\n }\n )\n }\n )\n );\n});\nPopperArrow.displayName = ARROW_NAME;\nfunction isNotNull(value) {\n return value !== null;\n}\nvar transformOrigin = (options) => ({\n name: \"transformOrigin\",\n options,\n fn(data) {\n const { placement, rects, middlewareData } = data;\n const cannotCenterArrow = middlewareData.arrow?.centerOffset !== 0;\n const isArrowHidden = cannotCenterArrow;\n const arrowWidth = isArrowHidden ? 0 : options.arrowWidth;\n const arrowHeight = isArrowHidden ? 0 : options.arrowHeight;\n const [placedSide, placedAlign] = getSideAndAlignFromPlacement(placement);\n const noArrowAlign = { start: \"0%\", center: \"50%\", end: \"100%\" }[placedAlign];\n const arrowXCenter = (middlewareData.arrow?.x ?? 0) + arrowWidth / 2;\n const arrowYCenter = (middlewareData.arrow?.y ?? 0) + arrowHeight / 2;\n let x = \"\";\n let y = \"\";\n if (placedSide === \"bottom\") {\n x = isArrowHidden ? noArrowAlign : `${arrowXCenter}px`;\n y = `${-arrowHeight}px`;\n } else if (placedSide === \"top\") {\n x = isArrowHidden ? noArrowAlign : `${arrowXCenter}px`;\n y = `${rects.floating.height + arrowHeight}px`;\n } else if (placedSide === \"right\") {\n x = `${-arrowHeight}px`;\n y = isArrowHidden ? noArrowAlign : `${arrowYCenter}px`;\n } else if (placedSide === \"left\") {\n x = `${rects.floating.width + arrowHeight}px`;\n y = isArrowHidden ? noArrowAlign : `${arrowYCenter}px`;\n }\n return { data: { x, y } };\n }\n});\nfunction getSideAndAlignFromPlacement(placement) {\n const [side, align = \"center\"] = placement.split(\"-\");\n return [side, align];\n}\nvar Root2 = Popper;\nvar Anchor = PopperAnchor;\nvar Content = PopperContent;\nvar Arrow = PopperArrow;\nexport {\n ALIGN_OPTIONS,\n Anchor,\n Arrow,\n Content,\n Popper,\n PopperAnchor,\n PopperArrow,\n PopperContent,\n Root2 as Root,\n SIDE_OPTIONS,\n createPopperScope\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\n\n// src/tooltip.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\nimport { useId } from \"@radix-ui/react-id\";\nimport * as PopperPrimitive from \"@radix-ui/react-popper\";\nimport { createPopperScope } from \"@radix-ui/react-popper\";\nimport { Portal as PortalPrimitive } from \"@radix-ui/react-portal\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { createSlottable } from \"@radix-ui/react-slot\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport * as VisuallyHiddenPrimitive from \"@radix-ui/react-visually-hidden\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nvar [createTooltipContext, createTooltipScope] = createContextScope(\"Tooltip\", [\n createPopperScope\n]);\nvar usePopperScope = createPopperScope();\nvar PROVIDER_NAME = \"TooltipProvider\";\nvar DEFAULT_DELAY_DURATION = 700;\nvar TOOLTIP_OPEN = \"tooltip.open\";\nvar [TooltipProviderContextProvider, useTooltipProviderContext] = createTooltipContext(PROVIDER_NAME);\nvar TooltipProvider = (props) => {\n const {\n __scopeTooltip,\n delayDuration = DEFAULT_DELAY_DURATION,\n skipDelayDuration = 300,\n disableHoverableContent = false,\n children\n } = props;\n const isOpenDelayedRef = React.useRef(true);\n const isPointerInTransitRef = React.useRef(false);\n const skipDelayTimerRef = React.useRef(0);\n React.useEffect(() => {\n const skipDelayTimer = skipDelayTimerRef.current;\n return () => window.clearTimeout(skipDelayTimer);\n }, []);\n return /* @__PURE__ */ jsx(\n TooltipProviderContextProvider,\n {\n scope: __scopeTooltip,\n isOpenDelayedRef,\n delayDuration,\n onOpen: React.useCallback(() => {\n window.clearTimeout(skipDelayTimerRef.current);\n isOpenDelayedRef.current = false;\n }, []),\n onClose: React.useCallback(() => {\n window.clearTimeout(skipDelayTimerRef.current);\n skipDelayTimerRef.current = window.setTimeout(\n () => isOpenDelayedRef.current = true,\n skipDelayDuration\n );\n }, [skipDelayDuration]),\n isPointerInTransitRef,\n onPointerInTransitChange: React.useCallback((inTransit) => {\n isPointerInTransitRef.current = inTransit;\n }, []),\n disableHoverableContent,\n children\n }\n );\n};\nTooltipProvider.displayName = PROVIDER_NAME;\nvar TOOLTIP_NAME = \"Tooltip\";\nvar [TooltipContextProvider, useTooltipContext] = createTooltipContext(TOOLTIP_NAME);\nvar Tooltip = (props) => {\n const {\n __scopeTooltip,\n children,\n open: openProp,\n defaultOpen,\n onOpenChange,\n disableHoverableContent: disableHoverableContentProp,\n delayDuration: delayDurationProp\n } = props;\n const providerContext = useTooltipProviderContext(TOOLTIP_NAME, props.__scopeTooltip);\n const popperScope = usePopperScope(__scopeTooltip);\n const [trigger, setTrigger] = React.useState(null);\n const contentId = useId();\n const openTimerRef = React.useRef(0);\n const disableHoverableContent = disableHoverableContentProp ?? providerContext.disableHoverableContent;\n const delayDuration = delayDurationProp ?? providerContext.delayDuration;\n const wasOpenDelayedRef = React.useRef(false);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: (open2) => {\n if (open2) {\n providerContext.onOpen();\n document.dispatchEvent(new CustomEvent(TOOLTIP_OPEN));\n } else {\n providerContext.onClose();\n }\n onOpenChange?.(open2);\n },\n caller: TOOLTIP_NAME\n });\n const stateAttribute = React.useMemo(() => {\n return open ? wasOpenDelayedRef.current ? \"delayed-open\" : \"instant-open\" : \"closed\";\n }, [open]);\n const handleOpen = React.useCallback(() => {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = 0;\n wasOpenDelayedRef.current = false;\n setOpen(true);\n }, [setOpen]);\n const handleClose = React.useCallback(() => {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = 0;\n setOpen(false);\n }, [setOpen]);\n const handleDelayedOpen = React.useCallback(() => {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = window.setTimeout(() => {\n wasOpenDelayedRef.current = true;\n setOpen(true);\n openTimerRef.current = 0;\n }, delayDuration);\n }, [delayDuration, setOpen]);\n React.useEffect(() => {\n return () => {\n if (openTimerRef.current) {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = 0;\n }\n };\n }, []);\n return /* @__PURE__ */ jsx(PopperPrimitive.Root, { ...popperScope, children: /* @__PURE__ */ jsx(\n TooltipContextProvider,\n {\n scope: __scopeTooltip,\n contentId,\n open,\n stateAttribute,\n trigger,\n onTriggerChange: setTrigger,\n onTriggerEnter: React.useCallback(() => {\n if (providerContext.isOpenDelayedRef.current) handleDelayedOpen();\n else handleOpen();\n }, [providerContext.isOpenDelayedRef, handleDelayedOpen, handleOpen]),\n onTriggerLeave: React.useCallback(() => {\n if (disableHoverableContent) {\n handleClose();\n } else {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = 0;\n }\n }, [handleClose, disableHoverableContent]),\n onOpen: handleOpen,\n onClose: handleClose,\n disableHoverableContent,\n children\n }\n ) });\n};\nTooltip.displayName = TOOLTIP_NAME;\nvar TRIGGER_NAME = \"TooltipTrigger\";\nvar TooltipTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTooltip, ...triggerProps } = props;\n const context = useTooltipContext(TRIGGER_NAME, __scopeTooltip);\n const providerContext = useTooltipProviderContext(TRIGGER_NAME, __scopeTooltip);\n const popperScope = usePopperScope(__scopeTooltip);\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref, context.onTriggerChange);\n const isPointerDownRef = React.useRef(false);\n const hasPointerMoveOpenedRef = React.useRef(false);\n const handlePointerUp = React.useCallback(() => isPointerDownRef.current = false, []);\n React.useEffect(() => {\n return () => document.removeEventListener(\"pointerup\", handlePointerUp);\n }, [handlePointerUp]);\n return /* @__PURE__ */ jsx(PopperPrimitive.Anchor, { asChild: true, ...popperScope, children: /* @__PURE__ */ jsx(\n Primitive.button,\n {\n \"aria-describedby\": context.open ? context.contentId : void 0,\n \"data-state\": context.stateAttribute,\n ...triggerProps,\n ref: composedRefs,\n onPointerMove: composeEventHandlers(props.onPointerMove, (event) => {\n if (event.pointerType === \"touch\") return;\n if (!hasPointerMoveOpenedRef.current && !providerContext.isPointerInTransitRef.current) {\n context.onTriggerEnter();\n hasPointerMoveOpenedRef.current = true;\n }\n }),\n onPointerLeave: composeEventHandlers(props.onPointerLeave, () => {\n context.onTriggerLeave();\n hasPointerMoveOpenedRef.current = false;\n }),\n onPointerDown: composeEventHandlers(props.onPointerDown, () => {\n if (context.open) {\n context.onClose();\n }\n isPointerDownRef.current = true;\n document.addEventListener(\"pointerup\", handlePointerUp, { once: true });\n }),\n onFocus: composeEventHandlers(props.onFocus, () => {\n if (!isPointerDownRef.current) context.onOpen();\n }),\n onBlur: composeEventHandlers(props.onBlur, context.onClose),\n onClick: composeEventHandlers(props.onClick, context.onClose)\n }\n ) });\n }\n);\nTooltipTrigger.displayName = TRIGGER_NAME;\nvar PORTAL_NAME = \"TooltipPortal\";\nvar [PortalProvider, usePortalContext] = createTooltipContext(PORTAL_NAME, {\n forceMount: void 0\n});\nvar TooltipPortal = (props) => {\n const { __scopeTooltip, forceMount, children, container } = props;\n const context = useTooltipContext(PORTAL_NAME, __scopeTooltip);\n return /* @__PURE__ */ jsx(PortalProvider, { scope: __scopeTooltip, forceMount, children: /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(PortalPrimitive, { asChild: true, container, children }) }) });\n};\nTooltipPortal.displayName = PORTAL_NAME;\nvar CONTENT_NAME = \"TooltipContent\";\nvar TooltipContent = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopeTooltip);\n const { forceMount = portalContext.forceMount, side = \"top\", ...contentProps } = props;\n const context = useTooltipContext(CONTENT_NAME, props.__scopeTooltip);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: context.disableHoverableContent ? /* @__PURE__ */ jsx(TooltipContentImpl, { side, ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsx(TooltipContentHoverable, { side, ...contentProps, ref: forwardedRef }) });\n }\n);\nvar TooltipContentHoverable = React.forwardRef((props, forwardedRef) => {\n const context = useTooltipContext(CONTENT_NAME, props.__scopeTooltip);\n const providerContext = useTooltipProviderContext(CONTENT_NAME, props.__scopeTooltip);\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const [pointerGraceArea, setPointerGraceArea] = React.useState(null);\n const { trigger, onClose } = context;\n const content = ref.current;\n const { onPointerInTransitChange } = providerContext;\n const handleRemoveGraceArea = React.useCallback(() => {\n setPointerGraceArea(null);\n onPointerInTransitChange(false);\n }, [onPointerInTransitChange]);\n const handleCreateGraceArea = React.useCallback(\n (event, hoverTarget) => {\n const currentTarget = event.currentTarget;\n const exitPoint = { x: event.clientX, y: event.clientY };\n const exitSide = getExitSideFromRect(exitPoint, currentTarget.getBoundingClientRect());\n const paddedExitPoints = getPaddedExitPoints(exitPoint, exitSide);\n const hoverTargetPoints = getPointsFromRect(hoverTarget.getBoundingClientRect());\n const graceArea = getHull([...paddedExitPoints, ...hoverTargetPoints]);\n setPointerGraceArea(graceArea);\n onPointerInTransitChange(true);\n },\n [onPointerInTransitChange]\n );\n React.useEffect(() => {\n return () => handleRemoveGraceArea();\n }, [handleRemoveGraceArea]);\n React.useEffect(() => {\n if (trigger && content) {\n const handleTriggerLeave = (event) => handleCreateGraceArea(event, content);\n const handleContentLeave = (event) => handleCreateGraceArea(event, trigger);\n trigger.addEventListener(\"pointerleave\", handleTriggerLeave);\n content.addEventListener(\"pointerleave\", handleContentLeave);\n return () => {\n trigger.removeEventListener(\"pointerleave\", handleTriggerLeave);\n content.removeEventListener(\"pointerleave\", handleContentLeave);\n };\n }\n }, [trigger, content, handleCreateGraceArea, handleRemoveGraceArea]);\n React.useEffect(() => {\n if (pointerGraceArea) {\n const handleTrackPointerGrace = (event) => {\n const target = event.target;\n const pointerPosition = { x: event.clientX, y: event.clientY };\n const hasEnteredTarget = trigger?.contains(target) || content?.contains(target);\n const isPointerOutsideGraceArea = !isPointInPolygon(pointerPosition, pointerGraceArea);\n if (hasEnteredTarget) {\n handleRemoveGraceArea();\n } else if (isPointerOutsideGraceArea) {\n handleRemoveGraceArea();\n onClose();\n }\n };\n document.addEventListener(\"pointermove\", handleTrackPointerGrace);\n return () => document.removeEventListener(\"pointermove\", handleTrackPointerGrace);\n }\n }, [trigger, content, pointerGraceArea, onClose, handleRemoveGraceArea]);\n return /* @__PURE__ */ jsx(TooltipContentImpl, { ...props, ref: composedRefs });\n});\nvar [VisuallyHiddenContentContextProvider, useVisuallyHiddenContentContext] = createTooltipContext(TOOLTIP_NAME, { isInside: false });\nvar Slottable = createSlottable(\"TooltipContent\");\nvar TooltipContentImpl = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeTooltip,\n children,\n \"aria-label\": ariaLabel,\n onEscapeKeyDown,\n onPointerDownOutside,\n ...contentProps\n } = props;\n const context = useTooltipContext(CONTENT_NAME, __scopeTooltip);\n const popperScope = usePopperScope(__scopeTooltip);\n const { onClose } = context;\n React.useEffect(() => {\n document.addEventListener(TOOLTIP_OPEN, onClose);\n return () => document.removeEventListener(TOOLTIP_OPEN, onClose);\n }, [onClose]);\n React.useEffect(() => {\n if (context.trigger) {\n const handleScroll = (event) => {\n const target = event.target;\n if (target?.contains(context.trigger)) onClose();\n };\n window.addEventListener(\"scroll\", handleScroll, { capture: true });\n return () => window.removeEventListener(\"scroll\", handleScroll, { capture: true });\n }\n }, [context.trigger, onClose]);\n return /* @__PURE__ */ jsx(\n DismissableLayer,\n {\n asChild: true,\n disableOutsidePointerEvents: false,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside: (event) => event.preventDefault(),\n onDismiss: onClose,\n children: /* @__PURE__ */ jsxs(\n PopperPrimitive.Content,\n {\n \"data-state\": context.stateAttribute,\n ...popperScope,\n ...contentProps,\n ref: forwardedRef,\n style: {\n ...contentProps.style,\n // re-namespace exposed content custom properties\n ...{\n \"--radix-tooltip-content-transform-origin\": \"var(--radix-popper-transform-origin)\",\n \"--radix-tooltip-content-available-width\": \"var(--radix-popper-available-width)\",\n \"--radix-tooltip-content-available-height\": \"var(--radix-popper-available-height)\",\n \"--radix-tooltip-trigger-width\": \"var(--radix-popper-anchor-width)\",\n \"--radix-tooltip-trigger-height\": \"var(--radix-popper-anchor-height)\"\n }\n },\n children: [\n /* @__PURE__ */ jsx(Slottable, { children }),\n /* @__PURE__ */ jsx(VisuallyHiddenContentContextProvider, { scope: __scopeTooltip, isInside: true, children: /* @__PURE__ */ jsx(VisuallyHiddenPrimitive.Root, { id: context.contentId, role: \"tooltip\", children: ariaLabel || children }) })\n ]\n }\n )\n }\n );\n }\n);\nTooltipContent.displayName = CONTENT_NAME;\nvar ARROW_NAME = \"TooltipArrow\";\nvar TooltipArrow = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTooltip, ...arrowProps } = props;\n const popperScope = usePopperScope(__scopeTooltip);\n const visuallyHiddenContentContext = useVisuallyHiddenContentContext(\n ARROW_NAME,\n __scopeTooltip\n );\n return visuallyHiddenContentContext.isInside ? null : /* @__PURE__ */ jsx(PopperPrimitive.Arrow, { ...popperScope, ...arrowProps, ref: forwardedRef });\n }\n);\nTooltipArrow.displayName = ARROW_NAME;\nfunction getExitSideFromRect(point, rect) {\n const top = Math.abs(rect.top - point.y);\n const bottom = Math.abs(rect.bottom - point.y);\n const right = Math.abs(rect.right - point.x);\n const left = Math.abs(rect.left - point.x);\n switch (Math.min(top, bottom, right, left)) {\n case left:\n return \"left\";\n case right:\n return \"right\";\n case top:\n return \"top\";\n case bottom:\n return \"bottom\";\n default:\n throw new Error(\"unreachable\");\n }\n}\nfunction getPaddedExitPoints(exitPoint, exitSide, padding = 5) {\n const paddedExitPoints = [];\n switch (exitSide) {\n case \"top\":\n paddedExitPoints.push(\n { x: exitPoint.x - padding, y: exitPoint.y + padding },\n { x: exitPoint.x + padding, y: exitPoint.y + padding }\n );\n break;\n case \"bottom\":\n paddedExitPoints.push(\n { x: exitPoint.x - padding, y: exitPoint.y - padding },\n { x: exitPoint.x + padding, y: exitPoint.y - padding }\n );\n break;\n case \"left\":\n paddedExitPoints.push(\n { x: exitPoint.x + padding, y: exitPoint.y - padding },\n { x: exitPoint.x + padding, y: exitPoint.y + padding }\n );\n break;\n case \"right\":\n paddedExitPoints.push(\n { x: exitPoint.x - padding, y: exitPoint.y - padding },\n { x: exitPoint.x - padding, y: exitPoint.y + padding }\n );\n break;\n }\n return paddedExitPoints;\n}\nfunction getPointsFromRect(rect) {\n const { top, right, bottom, left } = rect;\n return [\n { x: left, y: top },\n { x: right, y: top },\n { x: right, y: bottom },\n { x: left, y: bottom }\n ];\n}\nfunction isPointInPolygon(point, polygon) {\n const { x, y } = point;\n let inside = false;\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n const ii = polygon[i];\n const jj = polygon[j];\n const xi = ii.x;\n const yi = ii.y;\n const xj = jj.x;\n const yj = jj.y;\n const intersect = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;\n if (intersect) inside = !inside;\n }\n return inside;\n}\nfunction getHull(points) {\n const newPoints = points.slice();\n newPoints.sort((a, b) => {\n if (a.x < b.x) return -1;\n else if (a.x > b.x) return 1;\n else if (a.y < b.y) return -1;\n else if (a.y > b.y) return 1;\n else return 0;\n });\n return getHullPresorted(newPoints);\n}\nfunction getHullPresorted(points) {\n if (points.length <= 1) return points.slice();\n const upperHull = [];\n for (let i = 0; i < points.length; i++) {\n const p = points[i];\n while (upperHull.length >= 2) {\n const q = upperHull[upperHull.length - 1];\n const r = upperHull[upperHull.length - 2];\n if ((q.x - r.x) * (p.y - r.y) >= (q.y - r.y) * (p.x - r.x)) upperHull.pop();\n else break;\n }\n upperHull.push(p);\n }\n upperHull.pop();\n const lowerHull = [];\n for (let i = points.length - 1; i >= 0; i--) {\n const p = points[i];\n while (lowerHull.length >= 2) {\n const q = lowerHull[lowerHull.length - 1];\n const r = lowerHull[lowerHull.length - 2];\n if ((q.x - r.x) * (p.y - r.y) >= (q.y - r.y) * (p.x - r.x)) lowerHull.pop();\n else break;\n }\n lowerHull.push(p);\n }\n lowerHull.pop();\n if (upperHull.length === 1 && lowerHull.length === 1 && upperHull[0].x === lowerHull[0].x && upperHull[0].y === lowerHull[0].y) {\n return upperHull;\n } else {\n return upperHull.concat(lowerHull);\n }\n}\nvar Provider = TooltipProvider;\nvar Root3 = Tooltip;\nvar Trigger = TooltipTrigger;\nvar Portal = TooltipPortal;\nvar Content2 = TooltipContent;\nvar Arrow2 = TooltipArrow;\nexport {\n Arrow2 as Arrow,\n Content2 as Content,\n Portal,\n Provider,\n Root3 as Root,\n Tooltip,\n TooltipArrow,\n TooltipContent,\n TooltipPortal,\n TooltipProvider,\n TooltipTrigger,\n Trigger,\n createTooltipScope\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\r\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\r\nimport { cn } from \"@/lib/cn\";\r\n\r\nexport function TooltipProvider({ children }: { children: React.ReactNode }) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const Provider = TooltipPrimitive.Provider as any;\r\n return <Provider delayDuration={200}>{children}</Provider>;\r\n}\r\n\r\nexport function Tooltip({ children, open, defaultOpen, onOpenChange }: { children: React.ReactNode; open?: boolean; defaultOpen?: boolean; onOpenChange?: (open: boolean) => void }) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const Root = TooltipPrimitive.Root as any;\r\n return <Root open={open} defaultOpen={defaultOpen} onOpenChange={onOpenChange}>{children}</Root>;\r\n}\r\n\r\nexport function TooltipTrigger({ children, asChild }: { children: React.ReactNode; asChild?: boolean }) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const Trigger = TooltipPrimitive.Trigger as any;\r\n return <Trigger asChild={asChild}>{children}</Trigger>;\r\n}\r\n\r\nexport function TooltipContent({ className, children, sideOffset = 4 }: { className?: string; children: React.ReactNode; sideOffset?: number }) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const Content = TooltipPrimitive.Content as any;\r\n return (\r\n <Content\r\n sideOffset={sideOffset}\r\n className={cn(\r\n \"z-50 overflow-hidden rounded-md border border-card-border bg-card px-3 py-1.5 text-xs text-foreground-secondary shadow-md backdrop-blur-sm\",\r\n className\r\n )}\r\n >\r\n {children}\r\n </Content>\r\n );\r\n}\r\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { formatShortId } from \"@/lib/utils\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\n\ninterface SessionPillProps {\n sessionId?: string;\n active?: boolean;\n className?: string;\n}\n\nexport function SessionPill({ sessionId, active = false, className }: SessionPillProps) {\n const [copied, setCopied] = useState(false);\n\n if (!sessionId) return null;\n\n const handleCopy = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n navigator.clipboard.writeText(sessionId);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n className={cn(\n \"relative inline-flex items-center gap-1.5 rounded-full bg-background-secondary px-2.5 py-0.5 text-xs font-mono text-foreground-muted cursor-pointer transition-all hover:bg-background-tertiary select-none\",\n active && \"shadow-neon-glow-cyan-sm\",\n className\n )}\n onClick={handleCopy}\n >\n <span\n className={cn(\n \"h-1.5 w-1.5 rounded-full\",\n active ? \"bg-secondary shadow-[0_0_6px_var(--secondary)] animate-pulse-dot\" : \"bg-foreground-muted/40\"\n )}\n />\n {formatShortId(sessionId, 4)}\n {copied && (\n <span className=\"absolute -top-7 left-1/2 -translate-x-1/2 rounded-md bg-primary px-2 py-0.5 text-xs leading-tight font-sans font-medium text-primary-foreground whitespace-nowrap animate-slide-in-right\">\n Copied!\n </span>\n )}\n </span>\n </TooltipTrigger>\n <TooltipContent>\n <p className=\"font-mono text-xs\">\n {copied ? \"Copied!\" : `Session: ${sessionId}`}\n </p>\n {!copied && (\n <p className=\"text-foreground-muted text-xs leading-tight mt-0.5\">Click to copy</p>\n )}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n","'use client';\r\nimport { useState } from 'react';\r\nimport { formatShortId } from '@/lib/utils';\r\nimport { cn } from '@/lib/cn';\r\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\r\n\r\ninterface TruncatedIdProps {\r\n id: string;\r\n chars?: number;\r\n className?: string;\r\n}\r\n\r\nexport function TruncatedId({ id, chars = 4, className }: TruncatedIdProps) {\r\n const [copied, setCopied] = useState(false);\r\n\r\n const handleCopy = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n navigator.clipboard.writeText(id);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 1500);\r\n };\r\n\r\n return (\r\n <TooltipProvider>\r\n <Tooltip>\r\n <TooltipTrigger asChild>\r\n <span\r\n className={cn(\r\n 'inline-flex items-center justify-center rounded px-2 py-1 min-h-[44px] min-w-[44px] font-mono text-xs',\r\n 'bg-background-secondary text-info/80',\r\n 'hover:bg-background-tertiary hover:text-info',\r\n 'cursor-pointer transition-colors select-none',\r\n copied && 'text-primary',\r\n className\r\n )}\r\n onClick={handleCopy}\r\n role=\"button\"\r\n tabIndex={0}\r\n onKeyDown={(e: React.KeyboardEvent) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleCopy(e as unknown as React.MouseEvent); } }}\r\n >\r\n {formatShortId(id, chars)}\r\n </span>\r\n </TooltipTrigger>\r\n <TooltipContent>\r\n <p className=\"font-mono text-xs\">{copied ? <span className=\"text-primary font-semibold\">Copied!</span> : id}</p>\r\n </TooltipContent>\r\n </Tooltip>\r\n </TooltipProvider>\r\n );\r\n}\r\n","\"use client\";\r\nimport { memo } from \"react\";\r\nimport Link from \"next/link\";\r\nimport { cn } from \"@/lib/cn\";\r\nimport { Card } from \"@/components/ui/card\";\r\nimport { StatusBadge } from \"@/components/shared/status-badge\";\r\nimport { SessionPill } from \"@/components/shared/session-pill\";\r\nimport { TruncatedId } from \"@/components/shared/truncated-id\";\r\nimport { ProgressBar } from \"@/components/shared/progress-bar\";\r\nimport { formatDuration, friendlyProcessName, formatRelativeTime } from \"@/lib/utils\";\r\nimport type { Run } from \"@/types\";\r\nimport { Clock, Layers, Hand, AlertCircle, Tag, ExternalLink } from \"lucide-react\";\r\n\r\ninterface RunCardProps {\r\n run: Run;\r\n selected?: boolean;\r\n}\r\n\r\n/** Map run status to progress bar variant */\r\nfunction progressVariant(status: Run[\"status\"]): \"default\" | \"success\" | \"error\" | \"warning\" {\r\n switch (status) {\r\n case \"completed\":\r\n return \"success\";\r\n case \"failed\":\r\n return \"error\";\r\n case \"waiting\":\r\n return \"warning\";\r\n default:\r\n return \"default\";\r\n }\r\n}\r\n\r\n/** Compute display progress: completed runs always show 100% */\r\nfunction displayProgress(run: Run): number {\r\n if (run.status === \"completed\") return 100;\r\n if (run.totalTasks > 0) return Math.round((run.completedTasks / run.totalTasks) * 100);\r\n return 0;\r\n}\r\n\r\n/** Format stale time: \"Stale (2h ago)\", \"Stale (1d ago)\" */\r\nfunction formatStaleTime(updatedAt: string): string {\r\n const relative = formatRelativeTime(updatedAt);\r\n return relative ? `Stale (${relative})` : \"Stale\";\r\n}\r\n\r\n/**\r\n * Shallow comparison of Run props to prevent unnecessary re-renders.\r\n * Checks key fields that affect visual output rather than deep-comparing\r\n * the entire run object (which includes tasks[] and events[]).\r\n */\r\nfunction runCardPropsAreEqual(prev: RunCardProps, next: RunCardProps): boolean {\r\n if (prev.selected !== next.selected) return false;\r\n const a = prev.run;\r\n const b = next.run;\r\n return (\r\n a.runId === b.runId &&\r\n a.status === b.status &&\r\n a.updatedAt === b.updatedAt &&\r\n a.completedTasks === b.completedTasks &&\r\n a.totalTasks === b.totalTasks &&\r\n a.duration === b.duration &&\r\n a.isStale === b.isStale &&\r\n a.waitingKind === b.waitingKind &&\r\n a.breakpointQuestion === b.breakpointQuestion &&\r\n a.failedStep === b.failedStep &&\r\n a.failureMessage === b.failureMessage\r\n );\r\n}\r\n\r\nexport const RunCard = memo(function RunCard({ run, selected }: RunCardProps) {\r\n const progress = displayProgress(run);\r\n const isActive = run.status === \"waiting\" || run.status === \"pending\";\r\n const isStale = run.isStale === true;\r\n\r\n // Find the first breakpoint task that is waiting for approval\r\n const pendingBreakpoint = run.tasks.find(\r\n (t) => t.kind === \"breakpoint\" && t.status === \"requested\"\r\n );\r\n // Prefer run-level breakpointQuestion, fall back to task-level\r\n const breakpointQuestion = run.breakpointQuestion ?? pendingBreakpoint?.breakpointQuestion;\r\n\r\n // A breakpoint is active if: there's a pending breakpoint task OR the run is waiting on a breakpoint\r\n const hasActiveBreakpoint = !isStale && (\r\n !!pendingBreakpoint ||\r\n (run.status === \"waiting\" && run.waitingKind === \"breakpoint\")\r\n );\r\n\r\n // Failure point text: prefer run-level failedStep, then construct from failureMessage\r\n const failedStep = run.status === \"failed\"\r\n ? run.failedStep || (run.failureMessage ? `${run.failureMessage}` : undefined)\r\n : undefined;\r\n\r\n return (\r\n <Link href={`/runs/${run.runId}`}>\r\n <Card className={cn(\n \"cursor-pointer p-4 transition-all card-hover-lift\",\n \"hover:shadow-md\",\n selected && \"ring-1 ring-primary shadow-glow-primary\",\n isActive && !isStale && !hasActiveBreakpoint && \"border-[var(--border-hover)]\",\n hasActiveBreakpoint && \"border-warning/40 shadow-glow-warning ring-1 ring-warning/20 animate-breakpoint-glow\",\n isStale && \"opacity-50\"\r\n )}>\r\n <div className=\"flex items-start justify-between gap-3\">\r\n <div className=\"flex-1 min-w-0\">\r\n {/* Row 1: Title on its own row for readability */}\r\n <div className=\"flex items-center gap-2 mb-1.5\">\r\n <span className={cn(\r\n \"h-2 w-2 rounded-full shrink-0\",\r\n isStale\r\n ? \"bg-zinc-500\"\r\n : hasActiveBreakpoint ? \"bg-warning shadow-[0_0_8px_var(--warning)] animate-pulse-dot\" :\r\n run.status === \"completed\" ? \"bg-success shadow-[0_0_6px_var(--success)]\" :\r\n run.status === \"failed\" ? \"bg-error shadow-[0_0_6px_var(--error)]\" :\r\n run.status === \"waiting\" ? \"bg-warning shadow-[0_0_6px_var(--warning)] animate-pulse-dot\" :\r\n \"bg-pending\"\r\n )} />\r\n <span className=\"text-lg font-semibold italic font-serif text-foreground truncate\">\n {friendlyProcessName(run.processId)}\n </span>\n {hasActiveBreakpoint && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-warning/15 border border-warning/30 px-2.5 py-1 text-[11px] leading-tight font-bold text-warning uppercase tracking-[0.12em] shrink-0 animate-pulse-dot\">\n <Hand className=\"h-2.5 w-2.5\" />\n Approval Required\n </span>\n )}\r\n </div>\r\n {/* Row 2: Status badges and tags */}\r\n <div className=\"flex items-center gap-2 flex-wrap mb-1\">\r\n <StatusBadge\r\n status={run.status}\r\n waitingKind={run.waitingKind}\r\n isStale={isStale}\r\n />\r\n {isStale && (\r\n <span className=\"inline-flex items-center rounded-full bg-zinc-500/10 border border-zinc-500/20 px-2 py-0.5 text-xs leading-tight font-medium text-zinc-500 shrink-0\">\r\n {formatStaleTime(run.updatedAt)}\r\n </span>\r\n )}\r\n <TruncatedId id={run.runId} chars={4} className=\"text-foreground-secondary\" />\r\n {run.projectName && (\r\n <span className=\"inline-flex items-center gap-1 rounded-full bg-background-secondary px-2 py-0.5 text-xs leading-tight font-medium text-foreground-muted shrink-0\">\r\n <Tag className=\"h-2.5 w-2.5\" />\r\n {run.projectName}\r\n </span>\r\n )}\r\n </div>\r\n {/* Inline failure point for failed runs */}\r\n {failedStep && (\r\n <div className=\"flex items-center gap-1.5 mt-2 px-2 py-1 rounded-md bg-error-muted border border-error/20 border-l-2 border-l-error shadow-glow-error\">\r\n <AlertCircle className=\"h-3.5 w-3.5 text-error shrink-0\" />\r\n <span className=\"text-xs text-error truncate\">\r\n Failed at: {failedStep.length > 80 ? failedStep.slice(0, 80) + \"...\" : failedStep}\r\n </span>\r\n </div>\r\n )}\r\n {/* Breakpoint question panel — prominent display */}\r\n {hasActiveBreakpoint && breakpointQuestion && (\r\n <div className=\"mt-2 px-3 py-2 rounded-md bg-warning-muted border border-warning/25 border-l-2 border-l-warning shadow-breakpoint-glow\">\r\n <div className=\"flex items-start gap-2\">\r\n <Hand className=\"h-4 w-4 text-warning shrink-0 mt-0.5 animate-pulse-dot\" />\r\n <div className=\"flex-1 min-w-0\">\r\n <span className=\"text-xs font-bold text-warning uppercase tracking-wider block mb-0.5\">\r\n Awaiting approval\r\n </span>\r\n <span className=\"text-sm text-foreground leading-snug block\">\r\n {breakpointQuestion}\r\n </span>\r\n </div>\r\n <span className={cn(\r\n \"shrink-0 inline-flex items-center gap-1 px-2 py-1 rounded-md\",\r\n \"bg-warning/10 border border-warning/20\",\r\n \"text-xs font-semibold text-warning\",\r\n \"hover:bg-warning/20 transition-colors\"\r\n )}>\r\n Review & Approve\r\n <ExternalLink className=\"h-2.5 w-2.5\" />\r\n </span>\r\n </div>\r\n </div>\r\n )}\r\n {/* Breakpoint without question text — still show indicator */}\r\n {hasActiveBreakpoint && !breakpointQuestion && (\r\n <div className=\"flex items-center gap-2 mt-2 px-3 py-2 rounded-md bg-warning-muted border border-warning/25 border-l-2 border-l-warning shadow-breakpoint-glow\">\r\n <Hand className=\"h-4 w-4 text-warning shrink-0 animate-pulse-dot\" />\r\n <span className=\"text-xs font-semibold text-warning\">\r\n Approval needed\r\n </span>\r\n <span className={cn(\r\n \"ml-auto shrink-0 inline-flex items-center gap-1 px-2 py-1 rounded-md\",\r\n \"bg-warning/10 border border-warning/20\",\r\n \"text-xs font-semibold text-warning\"\r\n )}>\r\n Review & Approve\r\n <ExternalLink className=\"h-2.5 w-2.5\" />\r\n </span>\r\n </div>\r\n )}\r\n <div className=\"flex items-center gap-3 mt-2 text-xs text-foreground-muted\">\r\n <SessionPill sessionId={run.sessionId} active={isActive && !isStale} />\r\n <span className=\"inline-flex items-center gap-1\">\r\n <Layers className=\"h-3 w-3\" />\r\n {run.completedTasks}/{run.totalTasks} tasks\r\n </span>\r\n <span className=\"inline-flex items-center gap-1\">\r\n <Clock className=\"h-3 w-3\" />\r\n {formatDuration(run.duration)}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n {/* Task 1.8 — Show progress bar for ALL runs, not just active */}\r\n {run.totalTasks > 0 && (\r\n <ProgressBar value={progress} variant={progressVariant(run.status)} glow={isActive && !isStale} className=\"mt-4\" />\r\n )}\r\n </Card>\r\n </Link>\r\n );\r\n}, runCardPropsAreEqual);\r\n","\"use client\";\nimport { useRef, useMemo, useCallback } from \"react\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { RunCard } from \"./run-card\";\nimport type { Run } from \"@/types\";\n\n/** Estimated height of a single RunCard in pixels (used for initial measurement) */\nconst ESTIMATED_CARD_HEIGHT = 140;\n\n/** Number of items to render outside the visible area for smooth scrolling */\nconst OVERSCAN_COUNT = 3;\n\n/** Threshold below which we skip virtualization (overhead not worthwhile) */\nconst VIRTUALIZATION_THRESHOLD = 15;\n\ninterface VirtualizedRunListProps {\n /** Runs to display — must be pre-sorted by caller */\n runs: Run[];\n /** Optional className applied to the scroll container */\n className?: string;\n /** Maximum height for the scroll container. Defaults to 600px. */\n maxHeight?: number;\n /** Optional render wrapper per-item (e.g. to add time overlays in activity mode) */\n renderItem?: (run: Run, index: number) => React.ReactNode;\n}\n\n/**\n * Virtualized run card list using @tanstack/react-virtual.\n *\n * - Only renders visible cards plus a small overscan buffer.\n * - Uses stable sort keys (run.runId) to prevent reordering flash.\n * - Preserves scroll position when new runs are prepended by adjusting\n * the scroll offset.\n * - Falls back to a simple flat list when the item count is below the\n * VIRTUALIZATION_THRESHOLD to avoid unnecessary overhead.\n */\nexport function VirtualizedRunList({\n runs,\n className,\n maxHeight = 600,\n renderItem,\n}: VirtualizedRunListProps) {\n const parentRef = useRef<HTMLDivElement>(null);\n\n // Memoize the runs array to prevent unnecessary virtualizer recalculations.\n // The caller provides runs pre-sorted (by status or activity), and we use\n // runId as the stable key (via getItemKey) to prevent reordering flash\n // during rapid updates. This ensures React can reconcile virtual items\n // by identity rather than by position.\n const stableSortedRuns = useMemo(() => runs, [runs]);\n\n // Map of runId -> index for O(1) lookup during key extraction.\n const getItemKey = useCallback(\n (index: number) => stableSortedRuns[index]?.runId ?? index,\n [stableSortedRuns]\n );\n\n const virtualizer = useVirtualizer({\n count: stableSortedRuns.length,\n getScrollElement: () => parentRef.current,\n estimateSize: () => ESTIMATED_CARD_HEIGHT,\n overscan: OVERSCAN_COUNT,\n getItemKey,\n });\n\n // For small lists, skip virtualization entirely to avoid overhead.\n if (stableSortedRuns.length < VIRTUALIZATION_THRESHOLD) {\n return (\n <div className={className} data-testid=\"run-list-flat\">\n <div className=\"flex flex-col gap-2\">\n {stableSortedRuns.map((run, index) =>\n renderItem ? (\n <div key={run.runId}>{renderItem(run, index)}</div>\n ) : (\n <RunCard key={run.runId} run={run} />\n )\n )}\n </div>\n </div>\n );\n }\n\n const virtualItems = virtualizer.getVirtualItems();\n\n return (\n <div\n ref={parentRef}\n className={className}\n data-testid=\"run-list-virtualized\"\n style={{\n maxHeight,\n overflow: \"auto\",\n // Contain layout for paint performance\n contain: \"strict\",\n }}\n >\n <div\n style={{\n height: `${virtualizer.getTotalSize()}px`,\n width: \"100%\",\n position: \"relative\",\n }}\n >\n {virtualItems.map((virtualRow) => {\n const run = stableSortedRuns[virtualRow.index];\n if (!run) return null;\n\n return (\n <div\n key={virtualRow.key}\n data-index={virtualRow.index}\n ref={virtualizer.measureElement}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n transform: `translateY(${virtualRow.start}px)`,\n }}\n >\n <div style={{ paddingBottom: 8 }}>\n {renderItem ? renderItem(run, virtualRow.index) : <RunCard run={run} />}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","'use client';\r\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\r\nimport { cn } from '@/lib/cn';\r\n\r\ninterface PaginationControlsProps {\r\n currentPage: number;\r\n totalItems: number;\r\n itemsPerPage: number;\r\n onPageChange: (page: number) => void;\r\n className?: string;\r\n}\r\n\r\nexport function PaginationControls({\r\n currentPage,\r\n totalItems,\r\n itemsPerPage,\r\n onPageChange,\r\n className\r\n}: PaginationControlsProps) {\r\n const totalPages = Math.ceil(totalItems / itemsPerPage);\r\n const startItem = currentPage * itemsPerPage + 1;\r\n const endItem = Math.min((currentPage + 1) * itemsPerPage, totalItems);\r\n\r\n const canGoPrev = currentPage > 0;\r\n const canGoNext = currentPage < totalPages - 1;\r\n\r\n if (totalItems === 0) {\r\n return null;\r\n }\r\n\r\n // Build visible page numbers: show first, last, current, and neighbors\r\n const pageNumbers: (number | 'ellipsis')[] = [];\r\n if (totalPages <= 5) {\r\n for (let i = 0; i < totalPages; i++) pageNumbers.push(i);\r\n } else {\r\n pageNumbers.push(0);\r\n if (currentPage > 2) pageNumbers.push('ellipsis');\r\n for (let i = Math.max(1, currentPage - 1); i <= Math.min(totalPages - 2, currentPage + 1); i++) {\r\n pageNumbers.push(i);\r\n }\r\n if (currentPage < totalPages - 3) pageNumbers.push('ellipsis');\r\n pageNumbers.push(totalPages - 1);\r\n }\r\n\r\n return (\r\n <div className={cn('flex items-center justify-between border-t border-border pt-3', className)}>\r\n <span className=\"text-xs text-foreground-muted tabular-nums\">\r\n {startItem}–{endItem} of {totalItems}\r\n </span>\r\n <div className=\"flex items-center gap-0.5\">\r\n <button\r\n onClick={() => onPageChange(currentPage - 1)}\r\n disabled={!canGoPrev}\r\n className={cn(\r\n 'inline-flex h-11 w-11 items-center justify-center rounded-md text-xs transition-all',\r\n canGoPrev\r\n ? 'text-foreground hover:bg-primary-muted hover:text-primary hover:shadow-neon-glow-primary-xs cursor-pointer'\r\n : 'text-foreground-muted cursor-not-allowed opacity-40'\r\n )}\r\n aria-label=\"Previous page\"\r\n >\r\n <ChevronLeft className=\"h-4 w-4\" />\r\n </button>\r\n {pageNumbers.map((p, idx) =>\r\n p === 'ellipsis' ? (\r\n <span key={`ellipsis-${idx}`} className=\"inline-flex h-11 w-5 items-center justify-center text-xs text-foreground-muted\">\r\n ...\r\n </span>\r\n ) : (\r\n <button\r\n key={p}\r\n onClick={() => onPageChange(p)}\r\n className={cn(\r\n 'inline-flex h-11 min-w-[44px] items-center justify-center rounded-md px-1.5 text-xs font-medium tabular-nums transition-all',\r\n p === currentPage\r\n ? 'text-primary bg-primary/10'\r\n : 'text-foreground-muted hover:bg-background-secondary hover:text-foreground-secondary cursor-pointer'\r\n )}\r\n >\r\n {p + 1}\r\n </button>\r\n )\r\n )}\r\n <button\r\n onClick={() => onPageChange(currentPage + 1)}\r\n disabled={!canGoNext}\r\n className={cn(\r\n 'inline-flex h-11 w-11 items-center justify-center rounded-md text-xs transition-all',\r\n canGoNext\r\n ? 'text-foreground hover:bg-primary-muted hover:text-primary hover:shadow-neon-glow-primary-xs cursor-pointer'\r\n : 'text-foreground-muted cursor-not-allowed opacity-40'\r\n )}\r\n aria-label=\"Next page\"\r\n >\r\n <ChevronRight className=\"h-4 w-4\" />\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","'use client';\nimport { useSmartPolling } from './use-smart-polling';\nimport { Run } from '@/types';\n\ninterface ProjectRunsResponse {\n runs: Run[];\n totalCount: number;\n project: string;\n}\n\ninterface UseProjectRunsOptions {\n limit?: number;\n offset?: number;\n search?: string;\n status?: string;\n sort?: 'status' | 'activity';\n enabled?: boolean;\n}\n\nexport function useProjectRuns(\n projectName: string,\n options: UseProjectRunsOptions = {}\n) {\n const { limit = 10, offset = 0, search = '', status = '', sort = 'status', enabled = true } = options;\n const params = new URLSearchParams();\n params.set('project', projectName);\n params.set('limit', String(limit));\n params.set('offset', String(offset));\n if (search) params.set('search', search);\n if (status) params.set('status', status);\n if (sort && sort !== 'status') params.set('sort', sort);\n\n const url = `/api/runs?${params.toString()}`;\n\n const { data, loading, error, refresh } = useSmartPolling<ProjectRunsResponse>(\n url,\n {\n interval: 5000,\n sseFilter: () => true, // Any run update could affect this project\n enabled\n }\n );\n\n return {\n runs: enabled && data ? data.runs : [],\n totalCount: enabled && data ? data.totalCount : 0,\n loading,\n error,\n refresh\n };\n}\n","\"use client\";\r\nimport { useState, useCallback } from \"react\";\r\nimport { cn } from \"@/lib/cn\";\r\nimport { Card } from \"@/components/ui/card\";\r\nimport { RunCard } from \"./run-card\";\r\nimport { VirtualizedRunList } from \"./virtualized-run-list\";\r\nimport { PaginationControls } from \"./pagination-controls\";\r\nimport { useProjectRuns } from \"@/hooks/use-project-runs\";\r\nimport { usePersistedState } from \"@/hooks/use-persisted-state\";\r\nimport { resilientFetch } from \"@/lib/fetcher\";\r\nimport { formatRelativeTime } from \"@/lib/utils\";\r\nimport type { ProjectSummary, RunStatus } from \"@/types\";\r\nimport {\r\n Activity,\r\n CheckCircle2,\r\n AlertCircle,\r\n Layers,\r\n ChevronDown,\r\n ChevronUp,\r\n Clock,\r\n Pause,\r\n History,\r\n Hand,\r\n EyeOff,\r\n Loader2,\r\n} from \"lucide-react\";\r\n\r\ninterface ProjectHealthCardProps {\r\n project: ProjectSummary;\r\n statusFilter: RunStatus | \"all\";\r\n sortMode?: \"status\" | \"activity\";\r\n onHide?: (projectName: string) => void;\r\n}\r\n\r\ntype HealthStatus = \"healthy\" | \"active\" | \"stale\" | \"failing\";\r\n\r\nfunction getHealthStatus(project: ProjectSummary): HealthStatus {\r\n if (project.failedRuns > 0) return \"failing\";\r\n if (project.activeRuns > 0) return \"active\";\r\n if (project.staleRuns > 0) return \"stale\";\r\n return \"healthy\";\r\n}\r\n\r\nconst healthConfig: Record<\r\n HealthStatus,\r\n { dotClass: string; borderClass: string; icon: typeof CheckCircle2; label: string; barColor: string }\r\n> = {\r\n healthy: {\r\n dotClass: \"bg-success shadow-[0_0_6px_var(--success)]\",\r\n borderClass: \"border-success/20 hover:border-success/40\",\r\n icon: CheckCircle2,\r\n label: \"Healthy\",\r\n barColor: \"bg-success\",\r\n },\r\n active: {\r\n dotClass: \"bg-warning shadow-[0_0_6px_var(--warning)] animate-pulse-dot\",\r\n borderClass: \"border-warning/20 hover:border-warning/40\",\r\n icon: Activity,\r\n label: \"Active\",\r\n barColor: \"bg-warning\",\r\n },\r\n stale: {\r\n dotClass: \"bg-zinc-500\",\r\n borderClass: \"border-zinc-500/20 hover:border-zinc-500/40\",\r\n icon: Pause,\r\n label: \"Stale\",\r\n barColor: \"bg-zinc-500\",\r\n },\r\n failing: {\r\n dotClass: \"bg-error shadow-[0_0_6px_var(--error)]\",\r\n borderClass: \"border-error/20 hover:border-error/40\",\r\n icon: AlertCircle,\r\n label: \"Failing\",\r\n barColor: \"bg-error\",\r\n },\r\n};\r\n\r\nconst PAGE_SIZE = 5;\r\n\r\nexport function ProjectHealthCard({ project, statusFilter, sortMode = \"status\", onHide }: ProjectHealthCardProps) {\r\n const [hiding, setHiding] = useState(false);\r\n\r\n const handleHide = useCallback(async (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n setHiding(true);\r\n\r\n // First fetch current config to get existing hiddenProjects\r\n const configResult = await resilientFetch<{ hiddenProjects?: string[]; sources: { path: string; depth: number; label?: string }[]; pollInterval: number; theme: string; retentionDays: number }>(\"/api/config\");\r\n if (!configResult.ok) {\r\n setHiding(false);\r\n return;\r\n }\r\n\r\n const currentHidden = configResult.data.hiddenProjects ?? [];\r\n if (currentHidden.includes(project.projectName)) {\r\n // Already hidden\r\n setHiding(false);\r\n onHide?.(project.projectName);\r\n return;\r\n }\r\n\r\n const newHidden = [...currentHidden, project.projectName];\r\n const saveResult = await resilientFetch(\"/api/config\", {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({\r\n sources: configResult.data.sources,\r\n pollInterval: configResult.data.pollInterval,\r\n theme: configResult.data.theme,\r\n retentionDays: configResult.data.retentionDays,\r\n hiddenProjects: newHidden,\r\n }),\r\n });\r\n\r\n setHiding(false);\r\n if (saveResult.ok) {\r\n onHide?.(project.projectName);\r\n }\r\n }, [project.projectName, onHide]);\r\n\r\n const [expanded, setExpanded] = usePersistedState(\r\n `observer:project-expanded:${project.projectName}`,\r\n false\r\n );\r\n const [page, setPage] = useState(0);\r\n const [showCompleted, setShowCompleted] = useState(false);\r\n const [showFailed, setShowFailed] = useState(false);\r\n const [localFilter, setLocalFilter] = useState<RunStatus | \"all\">(\"all\");\r\n\r\n const health = getHealthStatus(project);\r\n const config = healthConfig[health];\r\n const StatusIcon = config.icon;\r\n\r\n const taskProgress = project.totalTasks > 0\r\n ? Math.round((project.completedTasksAggregate / project.totalTasks) * 100)\r\n : 0;\r\n\r\n // Effective filter: local filter takes precedence when set, otherwise use parent filter\r\n const effectiveFilter = localFilter !== \"all\" ? localFilter : statusFilter;\r\n\r\n const { runs, totalCount, loading } = useProjectRuns(\r\n project.projectName,\r\n {\r\n limit: PAGE_SIZE,\r\n offset: page * PAGE_SIZE,\r\n status: effectiveFilter === \"all\" ? \"\" : effectiveFilter,\r\n sort: sortMode,\r\n enabled: expanded,\r\n }\r\n );\r\n\r\n // Toggle local filter from mini KPI pills: clicking active filter clears it\r\n const toggleLocalFilter = (filter: RunStatus | \"all\") => {\r\n setLocalFilter((prev) => (prev === filter ? \"all\" : filter));\r\n setPage(0); // Reset pagination when filter changes\r\n };\r\n\r\n return (\r\n <Card\r\n data-testid={`project-card-${project.projectName}`}\r\n className={cn(\r\n \"transition-all duration-200 overflow-hidden card-hover-lift\",\r\n config.borderClass,\r\n expanded && \"ring-1 ring-primary/20\"\r\n )}\r\n >\r\n {/* Card header */}\r\n <button\r\n onClick={() => setExpanded((v) => !v)}\r\n className=\"w-full text-left p-4 hover:bg-background-secondary/30 transition-colors\"\r\n >\r\n {/* Row 1: Project title — full width, visually dominant */}\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <div className=\"flex items-center gap-2 truncate flex-1\">\r\n <h3 className=\"text-lg font-semibold text-foreground truncate\">\r\n {project.projectName}\r\n </h3>\r\n {project.pendingBreakpoints > 0 && (\r\n <span className={cn(\r\n \"inline-flex items-center gap-1 rounded-full px-2 py-0.5 shrink-0\",\r\n \"bg-warning/15 border border-warning/30\",\r\n \"text-xs leading-tight font-bold text-warning\",\r\n \"animate-pulse-dot\"\r\n )}>\r\n <Hand className=\"h-2.5 w-2.5\" />\r\n {project.pendingBreakpoints} Pending\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"flex items-center shrink-0 ml-2 gap-1\">\r\n <span\r\n role=\"button\"\r\n tabIndex={0}\r\n onClick={handleHide}\r\n onKeyDown={(e) => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); handleHide(e as unknown as React.MouseEvent); } }}\r\n className={cn(\r\n \"rounded-md p-2 min-h-[44px] min-w-[44px] inline-flex items-center justify-center transition-colors\",\r\n hiding\r\n ? \"text-foreground-muted cursor-wait\"\r\n : \"text-foreground-muted/40 hover:text-foreground-muted hover:bg-background-secondary\"\r\n )}\r\n title=\"Hide project from dashboard\"\r\n >\r\n {hiding ? (\r\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\r\n ) : (\r\n <EyeOff className=\"h-3.5 w-3.5\" />\r\n )}\r\n </span>\r\n {expanded ? (\r\n <ChevronUp className=\"h-4 w-4 text-foreground-muted\" />\r\n ) : (\r\n <ChevronDown className=\"h-4 w-4 text-foreground-muted\" />\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Row 2: Health status + run count badges */}\r\n <div className=\"flex items-center justify-between mb-3\">\r\n <div className=\"flex items-center gap-3 text-xs text-foreground-muted\">\r\n <span className=\"inline-flex items-center gap-1.5\">\r\n <span className={cn(\"h-2.5 w-2.5 rounded-full shrink-0\", config.dotClass)} />\r\n <StatusIcon className=\"h-3 w-3\" />\r\n {config.label}\r\n </span>\r\n <span className=\"inline-flex items-center gap-1\">\r\n <Layers className=\"h-3 w-3\" />\r\n {project.totalRuns}\r\n </span>\r\n <span className=\"inline-flex items-center gap-1\">\r\n <Clock className=\"h-3 w-3\" />\r\n {formatRelativeTime(project.latestUpdate)}\r\n </span>\r\n </div>\r\n {/* Compact status badges with icons */}\r\n <div className=\"flex items-center gap-1.5 shrink-0\">\r\n {project.activeRuns > 0 && (\r\n <span className=\"inline-flex items-center gap-0.5 rounded-full bg-warning/10 border border-warning/20 px-1.5 py-0.5 text-xs leading-tight font-medium text-warning tabular-nums\" title={`${project.activeRuns} active`}>\r\n <Activity className=\"h-3 w-3\" />\r\n {project.activeRuns}\r\n </span>\r\n )}\r\n {project.staleRuns > 0 && (\r\n <span className=\"inline-flex items-center gap-0.5 rounded-full bg-zinc-500/10 border border-zinc-500/20 px-1.5 py-0.5 text-xs leading-tight font-medium text-zinc-500 tabular-nums\" title={`${project.staleRuns} stale`}>\r\n <Pause className=\"h-3 w-3\" />\r\n {project.staleRuns}\r\n </span>\r\n )}\r\n {project.completedRuns > 0 && (\r\n <span className=\"inline-flex items-center gap-0.5 rounded-full bg-success/10 border border-success/20 px-1.5 py-0.5 text-xs leading-tight font-medium text-success tabular-nums\" title={`${project.completedRuns} completed`}>\r\n <CheckCircle2 className=\"h-3 w-3\" />\r\n {project.completedRuns}\r\n </span>\r\n )}\r\n {project.failedRuns > 0 && (\r\n <span className=\"inline-flex items-center gap-0.5 rounded-full bg-error/10 border border-error/20 px-1.5 py-0.5 text-xs leading-tight font-medium text-error tabular-nums\" title={`${project.failedRuns} failed`}>\r\n <AlertCircle className=\"h-3 w-3\" />\r\n {project.failedRuns}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Row 3: Mini progress bar — task completion */}\r\n {project.totalTasks > 0 && (\r\n <div>\r\n <div className=\"flex items-center justify-between mb-1\">\r\n <span className=\"text-xs leading-tight text-foreground-muted\">\r\n {project.completedTasksAggregate}/{project.totalTasks} tasks\r\n </span>\r\n <span className=\"text-xs leading-tight text-foreground-muted tabular-nums\">\r\n {taskProgress}%\r\n </span>\r\n </div>\r\n <div className=\"h-1.5 w-full rounded-full bg-background-secondary overflow-hidden\">\r\n <div\r\n className={cn(\"h-full rounded-full transition-all duration-500\", config.barColor)}\r\n style={{ width: `${taskProgress}%` }}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n </button>\r\n\r\n {/* Expanded: runs list — split into active and completed */}\r\n {expanded && (() => {\r\n const activeRuns = runs.filter((r) => r.status === \"waiting\" || r.status === \"pending\" || r.isStale);\r\n const successRuns = runs.filter((r) => r.status === \"completed\" && !r.isStale);\r\n const failedRuns = runs.filter((r) => r.status === \"failed\" && !r.isStale);\r\n const hasActiveRuns = activeRuns.length > 0;\r\n const hasSuccessRuns = successRuns.length > 0;\r\n const hasFailedRuns = failedRuns.length > 0;\r\n\r\n return (\r\n <div className=\"border-t border-border px-4 pb-4 pt-3\">\r\n {loading && runs.length === 0 ? (\r\n <div className=\"flex flex-col gap-2\">\r\n {[1, 2].map((i) => (\r\n <div\r\n key={i}\r\n className=\"rounded-lg border border-border bg-background p-3 animate-pulse\"\r\n >\r\n <div className=\"flex items-center gap-2 mb-2\">\r\n <div className=\"h-2 w-2 rounded-full bg-foreground-muted/20\" />\r\n <div className=\"h-3 w-32 rounded bg-foreground-muted/10\" />\r\n </div>\r\n <div className=\"h-2 w-full rounded bg-foreground-muted/10\" />\r\n </div>\r\n ))}\r\n </div>\r\n ) : runs.length === 0 ? (\r\n <p className=\"text-xs text-foreground-muted text-center py-4\">No matching runs</p>\r\n ) : sortMode === \"activity\" ? (\r\n /* ── Activity mode: flat chronological list ── */\r\n <div className=\"flex flex-col gap-3\">\r\n {/* Mini KPI Row — clickable to filter runs within this project */}\r\n <div className={cn(\"grid gap-2 mb-3\", project.staleRuns > 0 ? \"grid-cols-4\" : \"grid-cols-3\")}>\r\n <MiniKpiPill\r\n icon={<Activity className=\"h-3.5 w-3.5\" />}\r\n count={project.activeRuns}\r\n label=\"Active\"\r\n colorClass=\"text-warning\"\r\n bgClass=\"bg-warning/10\"\r\n pulse={project.activeRuns > 0}\r\n active={localFilter === \"waiting\"}\r\n onClick={(e) => { e.stopPropagation(); toggleLocalFilter(\"waiting\"); }}\r\n />\r\n {project.staleRuns > 0 && (\r\n <MiniKpiPill\r\n icon={<Pause className=\"h-3.5 w-3.5\" />}\r\n count={project.staleRuns}\r\n label=\"Stale\"\r\n colorClass=\"text-zinc-500\"\r\n bgClass=\"bg-zinc-500/10\"\r\n active={localFilter === \"waiting\"}\r\n onClick={(e) => { e.stopPropagation(); toggleLocalFilter(\"waiting\"); }}\r\n />\r\n )}\r\n <MiniKpiPill\r\n icon={<CheckCircle2 className=\"h-3.5 w-3.5\" />}\r\n count={project.completedRuns}\r\n label=\"Completed\"\r\n colorClass=\"text-success\"\r\n bgClass=\"bg-success/10\"\r\n active={localFilter === \"completed\"}\r\n onClick={(e) => { e.stopPropagation(); toggleLocalFilter(\"completed\"); }}\r\n />\r\n <MiniKpiPill\r\n icon={<AlertCircle className=\"h-3.5 w-3.5\" />}\r\n count={project.failedRuns}\r\n label=\"Failed\"\r\n colorClass=\"text-error\"\r\n bgClass=\"bg-error/10\"\r\n active={localFilter === \"failed\"}\r\n onClick={(e) => { e.stopPropagation(); toggleLocalFilter(\"failed\"); }}\r\n />\r\n </div>\r\n\r\n {/* Flat chronological run list — all runs in one timeline */}\r\n <div className=\"flex items-center gap-2 mb-1\">\r\n <Clock className=\"h-3.5 w-3.5 text-primary\" />\r\n <span className=\"text-xs font-semibold text-foreground\">Timeline</span>\r\n <span className=\"rounded-full bg-primary/10 border border-primary/20 px-2 py-px text-xs font-semibold text-primary tabular-nums\">\r\n {runs.length}\r\n </span>\r\n </div>\r\n <VirtualizedRunList\r\n runs={runs}\r\n maxHeight={500}\r\n renderItem={(run) => (\r\n <div className=\"relative\">\r\n <RunCard run={run} />\r\n {/* Relative time overlay label */}\r\n <span className=\"absolute top-2 right-2 inline-flex items-center gap-1 rounded-full bg-background/80 backdrop-blur-sm border border-border px-2 py-0.5 text-xs text-foreground-muted tabular-nums pointer-events-none z-10\">\r\n <Clock className=\"h-2.5 w-2.5\" />\r\n {formatRelativeTime(run.updatedAt)}\r\n </span>\r\n </div>\r\n )}\r\n />\r\n </div>\r\n ) : (\r\n /* ── Status mode: grouped sections (original behavior) ── */\r\n <div className=\"flex flex-col gap-3\">\r\n {/* Mini KPI Row — clickable to filter runs within this project */}\r\n <div className={cn(\"grid gap-2 mb-3\", project.staleRuns > 0 ? \"grid-cols-4\" : \"grid-cols-3\")}>\r\n <MiniKpiPill\r\n icon={<Activity className=\"h-3.5 w-3.5\" />}\r\n count={project.activeRuns}\r\n label=\"Active\"\r\n colorClass=\"text-warning\"\r\n bgClass=\"bg-warning/10\"\r\n pulse={project.activeRuns > 0}\r\n active={localFilter === \"waiting\"}\r\n onClick={(e) => { e.stopPropagation(); toggleLocalFilter(\"waiting\"); }}\r\n />\r\n {project.staleRuns > 0 && (\r\n <MiniKpiPill\r\n icon={<Pause className=\"h-3.5 w-3.5\" />}\r\n count={project.staleRuns}\r\n label=\"Stale\"\r\n colorClass=\"text-zinc-500\"\r\n bgClass=\"bg-zinc-500/10\"\r\n active={localFilter === \"waiting\"}\r\n onClick={(e) => { e.stopPropagation(); toggleLocalFilter(\"waiting\"); }}\r\n />\r\n )}\r\n <MiniKpiPill\r\n icon={<CheckCircle2 className=\"h-3.5 w-3.5\" />}\r\n count={project.completedRuns}\r\n label=\"Completed\"\r\n colorClass=\"text-success\"\r\n bgClass=\"bg-success/10\"\r\n active={localFilter === \"completed\"}\r\n onClick={(e) => { e.stopPropagation(); toggleLocalFilter(\"completed\"); }}\r\n />\r\n <MiniKpiPill\r\n icon={<AlertCircle className=\"h-3.5 w-3.5\" />}\r\n count={project.failedRuns}\r\n label=\"Failed\"\r\n colorClass=\"text-error\"\r\n bgClass=\"bg-error/10\"\r\n active={localFilter === \"failed\"}\r\n onClick={(e) => { e.stopPropagation(); toggleLocalFilter(\"failed\"); }}\r\n />\r\n </div>\r\n\r\n {/* Active runs — always visible with section header */}\r\n {hasActiveRuns && (\r\n <div className=\"mb-2\">\r\n <div className=\"flex items-center gap-2 mb-2\">\r\n <Activity className=\"h-3.5 w-3.5 text-warning animate-pulse-dot\" />\r\n <span className=\"text-xs font-semibold text-foreground\">In Progress</span>\r\n <span className=\"rounded-full bg-warning/10 border border-warning/20 px-2 py-px text-xs font-semibold text-warning tabular-nums\">\r\n {activeRuns.length}\r\n </span>\r\n </div>\r\n <VirtualizedRunList runs={activeRuns} maxHeight={500} />\r\n </div>\r\n )}\r\n\r\n {/* Failed runs — collapsible section */}\r\n {hasFailedRuns && (\r\n <div>\r\n <button\r\n onClick={(e) => { e.stopPropagation(); setShowFailed((v) => !v); }}\r\n className=\"flex items-center gap-2 py-1.5 text-xs group w-fit\"\r\n >\r\n <AlertCircle className=\"h-3.5 w-3.5 text-error/70\" />\r\n <span className=\"font-semibold text-error/80 group-hover:text-error transition-colors\">Failed Runs</span>\r\n <span className=\"rounded-full bg-error/10 border border-error/20 px-2 py-px text-xs font-semibold text-error tabular-nums\">\r\n {failedRuns.length}\r\n </span>\r\n {showFailed ? (\r\n <ChevronUp className=\"h-3 w-3 text-error/40 group-hover:text-error/60\" />\r\n ) : (\r\n <ChevronDown className=\"h-3 w-3 text-error/40 group-hover:text-error/60\" />\r\n )}\r\n </button>\r\n {showFailed && (\r\n <div className=\"mt-1 opacity-70\">\r\n <VirtualizedRunList runs={failedRuns} maxHeight={400} />\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Completed runs — collapsible section */}\r\n {hasSuccessRuns && (\r\n <div>\r\n <button\r\n onClick={(e) => { e.stopPropagation(); setShowCompleted((v) => !v); }}\r\n className=\"flex items-center gap-2 py-1.5 text-xs group w-fit\"\r\n >\r\n <History className=\"h-3.5 w-3.5 text-foreground-muted/70\" />\r\n <span className=\"font-semibold text-foreground-muted group-hover:text-foreground-secondary transition-colors\">Completed History</span>\r\n <span className=\"rounded-full bg-background-secondary border border-border px-2 py-px text-xs font-semibold text-foreground-muted tabular-nums\">\r\n {successRuns.length}\r\n </span>\r\n {showCompleted ? (\r\n <ChevronUp className=\"h-3 w-3 text-foreground-muted/60 group-hover:text-foreground-muted\" />\r\n ) : (\r\n <ChevronDown className=\"h-3 w-3 text-foreground-muted/60 group-hover:text-foreground-muted\" />\r\n )}\r\n </button>\r\n {showCompleted && (\r\n <div className=\"mt-1 opacity-60\">\r\n <VirtualizedRunList runs={successRuns} maxHeight={400} />\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n {totalCount > PAGE_SIZE && (\r\n <PaginationControls\r\n currentPage={page}\r\n totalItems={totalCount}\r\n itemsPerPage={PAGE_SIZE}\r\n onPageChange={setPage}\r\n className=\"mt-3\"\r\n />\r\n )}\r\n </div>\r\n );\r\n })()}\r\n </Card>\r\n );\r\n}\r\n\r\nfunction MiniKpiPill({ icon, count, label, colorClass, bgClass, pulse, active, onClick }: {\r\n icon: React.ReactNode; count: number; label: string; colorClass: string; bgClass: string; pulse?: boolean; active?: boolean; onClick?: (e: React.MouseEvent) => void;\r\n}) {\r\n const isClickable = !!onClick;\r\n return (\r\n <div\r\n role={isClickable ? \"button\" : undefined}\r\n tabIndex={isClickable ? 0 : undefined}\r\n onClick={onClick}\r\n onKeyDown={isClickable ? (e) => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); onClick?.(e as unknown as React.MouseEvent); } } : undefined}\r\n className={cn(\r\n \"rounded-md px-2.5 py-1.5 flex items-center gap-2 transition-all\",\r\n bgClass,\r\n isClickable && \"cursor-pointer hover:opacity-80\",\r\n active && \"ring-2 ring-offset-1 ring-offset-card\",\r\n active && colorClass.replace(\"text-\", \"ring-\").replace(/\\/\\d+$/, \"/50\"),\r\n )}\r\n >\r\n <span className={cn(colorClass, pulse && \"animate-pulse\")}>{icon}</span>\r\n <div>\r\n <p className={cn(\"text-sm font-bold tabular-nums leading-none\", colorClass)}>{count}</p>\r\n <p className=\"text-xs leading-tight text-foreground-muted uppercase tracking-wider\">{label}</p>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","\"use client\";\nimport {\n FolderOpen,\n Activity,\n Eye,\n Clock,\n History,\n ChevronDown,\n ChevronUp,\n} from \"lucide-react\";\nimport { cn } from \"@/lib/cn\";\nimport { ErrorBoundary } from \"@/components/shared/error-boundary\";\nimport { ProjectHealthCard } from \"./project-health-card\";\nimport type { ProjectSummary, RunStatus } from \"@/types\";\nimport type { DashboardSortMode, DashboardStatusFilter } from \"@/hooks/use-run-dashboard\";\n\n// ---------------------------------------------------------------------------\n// Loading skeleton\n// ---------------------------------------------------------------------------\n\nfunction LoadingSkeleton() {\n return (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 items-start\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"rounded-lg border border-border bg-card p-4 animate-pulse\">\n <div className=\"flex items-center gap-2 mb-3\">\n <div className=\"h-2.5 w-2.5 rounded-full bg-foreground-muted/20\" />\n <div className=\"h-4 w-32 rounded bg-foreground-muted/10\" />\n </div>\n <div className=\"h-1.5 w-full rounded-full bg-foreground-muted/10 mb-3\" />\n <div className=\"flex items-center gap-3\">\n <div className=\"h-5 w-16 rounded-full bg-foreground-muted/10\" />\n <div className=\"h-5 w-16 rounded-full bg-foreground-muted/10\" />\n <div className=\"h-3 w-12 rounded bg-foreground-muted/10\" />\n </div>\n </div>\n ))}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Error banner\n// ---------------------------------------------------------------------------\n\nfunction ErrorBanner({ error }: { error: string }) {\n return (\n <div data-testid=\"error-banner\" className=\"rounded-lg border border-error/20 bg-error-muted p-4 text-sm text-error\">\n Failed to load projects: {error}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Empty state (no projects matching filter)\n// ---------------------------------------------------------------------------\n\nfunction NoProjectsState() {\n return (\n <div data-testid=\"empty-state\" className=\"text-center py-16\">\n <FolderOpen className=\"h-10 w-10 text-foreground-muted/30 mx-auto mb-3\" />\n <p className=\"text-sm text-foreground-muted mb-1\">No projects found</p>\n <p className=\"text-xs text-foreground-muted/60\">\n Configure watch sources in{\" \"}\n <button\n onClick={() => window.dispatchEvent(new CustomEvent(\"open-settings\"))}\n className=\"text-primary hover:underline\"\n >\n Settings\n </button>{\" \"}\n or edit <span className=\"font-mono\">~/.a5c/observer.json</span>\n </p>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Idle empty state (no active and no history runs)\n// ---------------------------------------------------------------------------\n\nfunction IdleEmptyState() {\n return (\n <div data-testid=\"idle-empty-state\" className=\"text-center py-16\">\n <Eye className=\"h-10 w-10 text-foreground-muted/30 mx-auto mb-3\" />\n <p className=\"text-sm text-foreground-muted mb-1\">All quiet — no active orchestration runs</p>\n <p className=\"text-xs text-foreground-muted/60\">\n Runs will appear here when babysitter processes are started\n </p>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// ProjectListView (public)\n// ---------------------------------------------------------------------------\n\nexport interface ProjectListViewProps {\n loading: boolean;\n error: string | null | undefined;\n filteredProjects: ProjectSummary[];\n activeProjects: ProjectSummary[];\n historyProjects: ProjectSummary[];\n statusFilter: DashboardStatusFilter;\n sortMode: DashboardSortMode;\n cardStatusFilter: RunStatus | \"all\";\n historyCollapsed: boolean;\n onHistoryCollapsedChange: (value: boolean | ((prev: boolean) => boolean)) => void;\n onHideProject?: (projectName: string) => void;\n}\n\nexport function ProjectListView({\n loading,\n error,\n filteredProjects,\n activeProjects,\n historyProjects,\n statusFilter,\n sortMode,\n cardStatusFilter,\n historyCollapsed,\n onHistoryCollapsedChange,\n onHideProject,\n}: ProjectListViewProps) {\n if (loading) {\n return <LoadingSkeleton />;\n }\n\n if (error) {\n return <ErrorBanner error={error} />;\n }\n\n if (filteredProjects.length === 0) {\n return <NoProjectsState />;\n }\n\n return (\n <div className=\"flex flex-col gap-8\">\n {/* Idle empty state: no active and no history runs at all */}\n {activeProjects.length === 0 && historyProjects.length === 0 && (\n <IdleEmptyState />\n )}\n\n {/* Idle with history: no active/recent runs but has history */}\n {activeProjects.length === 0 && historyProjects.length > 0 && (statusFilter === \"all\" || statusFilter === \"stale\") && (\n <div data-testid=\"idle-with-history-banner\" className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-background-secondary/50 border border-border w-fit\">\n <Activity className=\"h-3.5 w-3.5 text-foreground-muted/50\" />\n <span className=\"text-xs text-foreground-muted\">\n {sortMode === \"activity\" ? \"No activity in the last 24 hours\" : \"No runs in progress\"}\n </span>\n </div>\n )}\n\n {/* Active / Recent section */}\n {activeProjects.length > 0 && (statusFilter === \"all\" || statusFilter === \"stale\" || statusFilter === \"waiting\") && (\n <ErrorBoundary section=\"Active Runs\">\n <section data-testid=\"active-runs-section\">\n <div className=\"flex items-center gap-2 mb-3\">\n {sortMode === \"activity\" ? (\n <Clock className=\"h-4 w-4 text-primary\" />\n ) : (\n <Activity className=\"h-4 w-4 text-warning animate-pulse-dot\" />\n )}\n <h2 className=\"text-sm font-semibold text-foreground\">\n {sortMode === \"activity\" ? \"Recent Activity\" : \"In Progress\"}\n </h2>\n <span className={cn(\n \"rounded-full px-2 py-px text-xs font-semibold tabular-nums\",\n sortMode === \"activity\"\n ? \"bg-primary/10 border border-primary/20 text-primary\"\n : \"bg-warning/10 border border-warning/20 text-warning\"\n )}>\n {activeProjects.length}\n </span>\n </div>\n <div data-testid=\"project-grid-active\" className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 items-start\">\n {activeProjects.map((project) => (\n <ProjectHealthCard\n key={project.projectName}\n project={project}\n statusFilter={cardStatusFilter}\n sortMode={sortMode}\n onHide={onHideProject}\n />\n ))}\n </div>\n </section>\n </ErrorBoundary>\n )}\n\n {/* When filter is \"completed\" or \"failed\", show filteredProjects directly without sectioning */}\n {(statusFilter === \"completed\" || statusFilter === \"failed\") && (\n <ErrorBoundary section=\"Filtered Results\">\n <div data-testid=\"project-grid-filtered\" className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 items-start\">\n {filteredProjects.map((project) => (\n <ProjectHealthCard\n key={project.projectName}\n project={project}\n statusFilter={cardStatusFilter}\n sortMode={sortMode}\n />\n ))}\n </div>\n </ErrorBoundary>\n )}\n\n {/* History / Earlier section */}\n {historyProjects.length > 0 && (statusFilter === \"all\" || statusFilter === \"stale\") && (\n <ErrorBoundary section=\"Recent History\">\n <section data-testid=\"recent-history-section\">\n <button\n onClick={() => onHistoryCollapsedChange((v) => !v)}\n className=\"flex items-center gap-2 mb-3 group w-fit\"\n >\n <History className=\"h-4 w-4 text-foreground-muted/70\" />\n <h2 className=\"text-sm font-semibold text-foreground-muted group-hover:text-foreground-secondary transition-colors\">\n {sortMode === \"activity\" ? \"Earlier\" : \"Recent History\"}\n </h2>\n <span className=\"rounded-full bg-background-secondary border border-border px-2 py-px text-xs font-semibold text-foreground-muted tabular-nums\">\n {historyProjects.length}\n </span>\n {historyCollapsed ? (\n <ChevronDown className=\"h-3.5 w-3.5 text-foreground-muted/60 group-hover:text-foreground-muted transition-colors\" />\n ) : (\n <ChevronUp className=\"h-3.5 w-3.5 text-foreground-muted/60 group-hover:text-foreground-muted transition-colors\" />\n )}\n </button>\n {!historyCollapsed && (\n <div className=\"opacity-70\">\n <div data-testid=\"project-grid-history\" className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 items-start\">\n {historyProjects.map((project) => (\n <ProjectHealthCard\n key={project.projectName}\n project={project}\n statusFilter={cardStatusFilter}\n sortMode={sortMode}\n />\n ))}\n </div>\n </div>\n )}\n </section>\n </ErrorBoundary>\n )}\n </div>\n );\n}\n","\"use client\";\nimport { useState, useEffect, useRef, useCallback } from \"react\";\nimport { subscribe, StreamEvent } from \"./use-event-stream\";\n\n// ---------------------------------------------------------------------------\n// Configuration\n// ---------------------------------------------------------------------------\n\n/** Window (ms) for counting rapid SSE events to detect burst mode. */\nconst BURST_WINDOW_MS = 5000;\n\n/** Number of SSE events within the burst window that triggers catch-up mode. */\nconst BURST_THRESHOLD = 10;\n\n/** How long (ms) to hold catch-up mode after the burst subsides. */\nconst CATCHUP_HOLD_MS = 3000;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface CatchUpState {\n /** Whether we are in catch-up mode (burst of events detected). */\n active: boolean;\n /** Number of batched/buffered updates while in catch-up mode. */\n bufferedCount: number;\n /** Dismiss catch-up mode and apply buffered updates immediately. */\n flush: () => void;\n}\n\nexport interface UseBatchedUpdatesOptions {\n /** SSE filter: only count events matching this predicate for burst detection. */\n sseFilter?: (event: StreamEvent) => boolean;\n /** Callback invoked when catch-up mode ends (either by timeout or flush). */\n onFlush?: () => void;\n /** Whether the hook is enabled (default true). */\n enabled?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Monitors SSE event rate and activates \"catch-up mode\" when a burst of\n * events is detected (e.g. opening dashboard after overnight runs).\n *\n * In catch-up mode, the caller should suppress real-time UI updates and\n * instead show a summary notification (\"12 runs updated\"). When the burst\n * subsides or the user clicks \"refresh now\", catch-up mode ends and the\n * caller should do a single full refresh.\n */\nexport function useBatchedUpdates(\n options: UseBatchedUpdatesOptions = {}\n): CatchUpState {\n const { sseFilter, onFlush, enabled = true } = options;\n const [active, setActive] = useState(false);\n const [bufferedCount, setBufferedCount] = useState(0);\n\n // Track SSE event timestamps within the burst window\n const eventTimestampsRef = useRef<number[]>([]);\n const catchUpActiveRef = useRef(false);\n const holdTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const sseFilterRef = useRef(sseFilter);\n sseFilterRef.current = sseFilter;\n const onFlushRef = useRef(onFlush);\n onFlushRef.current = onFlush;\n\n const exitCatchUp = useCallback(() => {\n catchUpActiveRef.current = false;\n setActive(false);\n setBufferedCount(0);\n eventTimestampsRef.current = [];\n if (holdTimerRef.current) {\n clearTimeout(holdTimerRef.current);\n holdTimerRef.current = null;\n }\n onFlushRef.current?.();\n }, []);\n\n const flush = useCallback(() => {\n if (catchUpActiveRef.current) {\n exitCatchUp();\n }\n }, [exitCatchUp]);\n\n useEffect(() => {\n if (!enabled) return;\n\n const unsubscribe = subscribe((event: StreamEvent) => {\n // Ignore non-data events\n if (\n event.type === \"connected\" ||\n event.type === \"disconnect\" ||\n event.type === \"error\"\n ) {\n return;\n }\n\n // Apply optional filter\n if (sseFilterRef.current && !sseFilterRef.current(event)) return;\n\n const now = Date.now();\n\n // Record timestamp and prune old entries\n eventTimestampsRef.current.push(now);\n eventTimestampsRef.current = eventTimestampsRef.current.filter(\n (t) => now - t < BURST_WINDOW_MS\n );\n\n if (catchUpActiveRef.current) {\n // Already in catch-up mode — increment buffered count\n setBufferedCount((c) => c + 1);\n\n // Reset the hold timer since events are still arriving\n if (holdTimerRef.current) {\n clearTimeout(holdTimerRef.current);\n }\n holdTimerRef.current = setTimeout(() => {\n exitCatchUp();\n }, CATCHUP_HOLD_MS);\n } else {\n // Check if we should enter catch-up mode\n if (eventTimestampsRef.current.length >= BURST_THRESHOLD) {\n catchUpActiveRef.current = true;\n setActive(true);\n setBufferedCount(eventTimestampsRef.current.length);\n\n // Set initial hold timer\n holdTimerRef.current = setTimeout(() => {\n exitCatchUp();\n }, CATCHUP_HOLD_MS);\n }\n }\n });\n\n return () => {\n unsubscribe();\n if (holdTimerRef.current) {\n clearTimeout(holdTimerRef.current);\n holdTimerRef.current = null;\n }\n };\n }, [enabled, exitCatchUp]);\n\n return { active, bufferedCount, flush };\n}\n\n// Export constants for testing\nexport { BURST_WINDOW_MS, BURST_THRESHOLD, CATCHUP_HOLD_MS };\n","\"use client\";\r\n\r\nimport { useState, useEffect, useRef, useCallback } from \"react\";\r\nimport { useRouter } from \"next/navigation\";\r\nimport { Search, X, ArrowRight } from \"lucide-react\";\r\nimport { cn } from \"@/lib/cn\";\r\nimport { StatusBadge } from \"@/components/shared/status-badge\";\r\nimport { friendlyProcessName, formatShortId } from \"@/lib/utils\";\r\nimport type { Run } from \"@/types\";\r\n\r\ninterface SearchResult {\r\n runs: Run[];\r\n totalCount: number;\r\n}\r\n\r\nexport function GlobalSearch() {\r\n const router = useRouter();\r\n const [query, setQuery] = useState(\"\");\r\n const [debouncedQuery, setDebouncedQuery] = useState(\"\");\r\n const [results, setResults] = useState<Run[]>([]);\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [selectedIndex, setSelectedIndex] = useState(-1);\r\n const [hasSearched, setHasSearched] = useState(false);\r\n\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const listRef = useRef<HTMLUListElement>(null);\r\n\r\n // Debounce the search query\r\n useEffect(() => {\r\n const timer = setTimeout(() => {\r\n setDebouncedQuery(query.trim());\r\n }, 300);\r\n return () => clearTimeout(timer);\r\n }, [query]);\r\n\r\n // Fetch results when debounced query changes\r\n useEffect(() => {\r\n if (!debouncedQuery) {\r\n setResults([]);\r\n setHasSearched(false);\r\n setSelectedIndex(-1);\r\n return;\r\n }\r\n\r\n let cancelled = false;\r\n\r\n async function fetchResults() {\r\n setIsLoading(true);\r\n try {\r\n const params = new URLSearchParams({\r\n search: debouncedQuery,\r\n limit: \"10\",\r\n });\r\n const res = await fetch(`/api/runs?${params}`);\r\n if (!res.ok) throw new Error(\"Search failed\");\r\n const data: SearchResult = await res.json();\r\n if (!cancelled) {\r\n setResults(data.runs ?? []);\r\n setHasSearched(true);\r\n setSelectedIndex(-1);\r\n }\r\n } catch {\r\n if (!cancelled) {\r\n setResults([]);\r\n setHasSearched(true);\r\n }\r\n } finally {\r\n if (!cancelled) {\r\n setIsLoading(false);\r\n }\r\n }\r\n }\r\n\r\n fetchResults();\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, [debouncedQuery]);\r\n\r\n // Navigate to a run\r\n const navigateToRun = useCallback(\r\n (runId: string) => {\r\n setIsOpen(false);\r\n setQuery(\"\");\r\n setResults([]);\r\n setHasSearched(false);\r\n router.push(`/runs/${runId}`);\r\n },\r\n [router]\r\n );\r\n\r\n // Keyboard navigation\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent) => {\r\n if (!isOpen) return;\r\n\r\n switch (e.key) {\r\n case \"ArrowDown\":\r\n e.preventDefault();\r\n setSelectedIndex((prev) =>\r\n prev < results.length - 1 ? prev + 1 : 0\r\n );\r\n break;\r\n case \"ArrowUp\":\r\n e.preventDefault();\r\n setSelectedIndex((prev) =>\r\n prev > 0 ? prev - 1 : results.length - 1\r\n );\r\n break;\r\n case \"Enter\":\r\n e.preventDefault();\r\n if (selectedIndex >= 0 && selectedIndex < results.length) {\r\n navigateToRun(results[selectedIndex].runId);\r\n }\r\n break;\r\n case \"Escape\":\r\n e.preventDefault();\r\n setIsOpen(false);\r\n inputRef.current?.blur();\r\n break;\r\n }\r\n },\r\n [isOpen, results, selectedIndex, navigateToRun]\r\n );\r\n\r\n // Scroll selected item into view\r\n useEffect(() => {\r\n if (selectedIndex >= 0 && listRef.current) {\r\n const items = listRef.current.querySelectorAll(\"[data-search-item]\");\r\n items[selectedIndex]?.scrollIntoView({ block: \"nearest\" });\r\n }\r\n }, [selectedIndex]);\r\n\r\n // Cmd+K / Ctrl+K and \"/\" global shortcut\r\n useEffect(() => {\r\n const handler = (e: KeyboardEvent) => {\r\n if ((e.metaKey || e.ctrlKey) && e.key === \"k\") {\r\n e.preventDefault();\r\n inputRef.current?.focus();\r\n setIsOpen(true);\r\n }\r\n // \"/\" key to focus search (skip if already in an input)\r\n if (\r\n e.key === \"/\" &&\r\n !e.metaKey && !e.ctrlKey && !e.altKey &&\r\n !(e.target instanceof HTMLInputElement) &&\r\n !(e.target instanceof HTMLTextAreaElement) &&\r\n !(e.target instanceof HTMLSelectElement) &&\r\n !(e.target as HTMLElement)?.isContentEditable\r\n ) {\r\n e.preventDefault();\r\n inputRef.current?.focus();\r\n setIsOpen(true);\r\n }\r\n };\r\n window.addEventListener(\"keydown\", handler);\r\n return () => window.removeEventListener(\"keydown\", handler);\r\n }, []);\r\n\r\n // Close dropdown on outside click\r\n useEffect(() => {\r\n const handler = (e: MouseEvent) => {\r\n if (\r\n containerRef.current &&\r\n !containerRef.current.contains(e.target as Node)\r\n ) {\r\n setIsOpen(false);\r\n }\r\n };\r\n document.addEventListener(\"mousedown\", handler);\r\n return () => document.removeEventListener(\"mousedown\", handler);\r\n }, []);\r\n\r\n const showDropdown = isOpen && (query.trim().length > 0);\r\n\r\n return (\r\n <div ref={containerRef} className=\"relative w-full max-w-xl mx-auto mb-6\">\r\n {/* Search input */}\r\n <div className=\"relative\">\r\n <Search className=\"absolute left-3.5 top-1/2 -translate-y-1/2 h-4 w-4 text-foreground-muted pointer-events-none\" />\r\n <input\r\n ref={inputRef}\r\n type=\"text\"\r\n value={query}\r\n onChange={(e) => {\r\n setQuery(e.target.value);\r\n setIsOpen(true);\r\n }}\r\n onFocus={() => {\r\n if (query.trim()) setIsOpen(true);\r\n }}\r\n onKeyDown={handleKeyDown}\r\n placeholder=\"Search runs by ID, process name, or task title...\"\r\n className={cn(\r\n \"w-full rounded-lg border border-border bg-card/80 backdrop-blur-sm\",\r\n \"pl-10 pr-20 py-2.5 text-sm text-foreground\",\r\n \"placeholder:text-foreground-muted/60\",\r\n \"focus:border-primary/40 focus:outline-none focus:ring-2 focus:ring-primary/30\",\r\n \"focus:shadow-neon-glow-primary-focus transition-all\"\r\n )}\r\n data-testid=\"global-search-input\"\r\n />\r\n <div className=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center gap-1.5\">\r\n {query && (\r\n <button\r\n onClick={() => {\r\n setQuery(\"\");\r\n setResults([]);\r\n setHasSearched(false);\r\n setIsOpen(false);\r\n inputRef.current?.focus();\r\n }}\r\n className=\"rounded-md p-2 min-h-[44px] min-w-[44px] flex items-center justify-center text-foreground-muted hover:text-foreground-secondary transition-colors\"\r\n aria-label=\"Clear search\"\r\n >\r\n <X className=\"h-3.5 w-3.5\" />\r\n </button>\r\n )}\r\n <kbd className=\"hidden sm:inline-flex items-center gap-0.5 rounded border border-border bg-background-secondary px-1.5 py-0.5 text-xs font-medium text-foreground-muted\">\r\n <span className=\"text-xs\">{typeof navigator !== \"undefined\" && /Mac/i.test(navigator.userAgent) ? \"\\u2318\" : \"Ctrl\"}</span>\r\n <span>K</span>\r\n </kbd>\r\n </div>\r\n </div>\r\n\r\n {/* Dropdown results */}\r\n {showDropdown && (\r\n <div\r\n className={cn(\r\n \"absolute z-50 top-full left-0 right-0 mt-1.5\",\r\n \"rounded-lg border border-border bg-card/95 backdrop-blur-md shadow-xl\",\r\n \"overflow-hidden\"\r\n )}\r\n data-testid=\"global-search-dropdown\"\r\n >\r\n {isLoading && (\r\n <div className=\"flex items-center gap-2 px-4 py-3 text-xs text-foreground-muted\">\r\n <div className=\"h-3 w-3 rounded-full border-2 border-primary/40 border-t-primary animate-spin\" />\r\n Searching...\r\n </div>\r\n )}\r\n\r\n {!isLoading && hasSearched && results.length === 0 && (\r\n <div className=\"px-4 py-6 text-center\">\r\n <Search className=\"h-5 w-5 text-foreground-muted/30 mx-auto mb-2\" />\r\n <p className=\"text-xs text-foreground-muted\">\r\n No runs found for &ldquo;{debouncedQuery}&rdquo;\r\n </p>\r\n </div>\r\n )}\r\n\r\n {!isLoading && results.length > 0 && (\r\n <ul ref={listRef} className=\"max-h-80 overflow-y-auto py-1\" role=\"listbox\">\r\n {results.map((run, index) => (\r\n <li\r\n key={run.runId}\r\n data-search-item\r\n role=\"option\"\r\n aria-selected={index === selectedIndex}\r\n onClick={() => navigateToRun(run.runId)}\r\n className={cn(\r\n \"flex items-center gap-3 px-4 py-2.5 cursor-pointer transition-colors\",\r\n index === selectedIndex\r\n ? \"bg-primary/10\"\r\n : \"hover:bg-background-secondary/60\"\r\n )}\r\n >\r\n {/* Status dot */}\r\n <span\r\n className={cn(\r\n \"h-2 w-2 rounded-full shrink-0\",\r\n run.status === \"completed\"\r\n ? \"bg-success\"\r\n : run.status === \"failed\"\r\n ? \"bg-error\"\r\n : run.status === \"waiting\" || run.status === \"pending\"\r\n ? \"bg-warning\"\r\n : \"bg-foreground-muted\"\r\n )}\r\n />\r\n {/* Info */}\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-sm font-medium text-foreground truncate\">\r\n {friendlyProcessName(run.processId)}\r\n </span>\r\n <StatusBadge\r\n status={run.status}\r\n waitingKind={run.waitingKind}\r\n isStale={run.isStale}\r\n />\r\n </div>\r\n <div className=\"flex items-center gap-2 mt-0.5\">\r\n {run.projectName && (\r\n <span className=\"text-xs text-foreground-muted\">\r\n {run.projectName}\r\n </span>\r\n )}\r\n <span className=\"font-mono text-xs text-info\">\r\n {formatShortId(run.runId, 8)}\r\n </span>\r\n </div>\r\n </div>\r\n {/* Navigate arrow */}\r\n <ArrowRight\r\n className={cn(\r\n \"h-3.5 w-3.5 shrink-0 transition-colors\",\r\n index === selectedIndex\r\n ? \"text-primary\"\r\n : \"text-foreground-muted/40\"\r\n )}\r\n />\r\n </li>\r\n ))}\r\n </ul>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","export type NoInfer<A extends any> = [A][A extends any ? 0 : never]\n\nexport type PartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\n\nexport function memo<TDeps extends ReadonlyArray<any>, TResult>(\n getDeps: () => [...TDeps],\n fn: (...args: NoInfer<[...TDeps]>) => TResult,\n opts: {\n key: false | string\n debug?: () => boolean\n onChange?: (result: TResult) => void\n initialDeps?: TDeps\n skipInitialOnChange?: boolean\n },\n) {\n let deps = opts.initialDeps ?? []\n let result: TResult | undefined\n let isInitial = true\n\n function memoizedFunction(): TResult {\n let depTime: number\n if (opts.key && opts.debug?.()) depTime = Date.now()\n\n const newDeps = getDeps()\n\n const depsChanged =\n newDeps.length !== deps.length ||\n newDeps.some((dep: any, index: number) => deps[index] !== dep)\n\n if (!depsChanged) {\n return result!\n }\n\n deps = newDeps\n\n let resultTime: number\n if (opts.key && opts.debug?.()) resultTime = Date.now()\n\n result = fn(...newDeps)\n\n if (opts.key && opts.debug?.()) {\n const depEndTime = Math.round((Date.now() - depTime!) * 100) / 100\n const resultEndTime = Math.round((Date.now() - resultTime!) * 100) / 100\n const resultFpsPercentage = resultEndTime / 16\n\n const pad = (str: number | string, num: number) => {\n str = String(str)\n while (str.length < num) {\n str = ' ' + str\n }\n return str\n }\n\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120),\n )}deg 100% 31%);`,\n opts?.key,\n )\n }\n\n if (opts?.onChange && !(isInitial && opts.skipInitialOnChange)) {\n opts.onChange(result)\n }\n\n isInitial = false\n\n return result\n }\n\n // Attach updateDeps to the function itself\n memoizedFunction.updateDeps = (newDeps: [...TDeps]) => {\n deps = newDeps\n }\n\n return memoizedFunction\n}\n\nexport function notUndefined<T>(value: T | undefined, msg?: string): T {\n if (value === undefined) {\n throw new Error(`Unexpected undefined${msg ? `: ${msg}` : ''}`)\n } else {\n return value\n }\n}\n\nexport const approxEqual = (a: number, b: number) => Math.abs(a - b) < 1.01\n\nexport const debounce = (\n targetWindow: Window & typeof globalThis,\n fn: Function,\n ms: number,\n) => {\n let timeoutId: number\n return function (this: any, ...args: Array<any>) {\n targetWindow.clearTimeout(timeoutId)\n timeoutId = targetWindow.setTimeout(() => fn.apply(this, args), ms)\n }\n}\n","import { approxEqual, debounce, memo, notUndefined } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollDirection = 'forward' | 'backward'\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\ntype ScrollBehavior = 'auto' | 'smooth' | 'instant'\n\nexport interface ScrollToOptions {\n align?: ScrollAlignment\n behavior?: ScrollBehavior\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string | bigint\n\nexport interface VirtualItem {\n key: Key\n index: number\n start: number\n end: number\n size: number\n lane: number\n}\n\nexport interface Rect {\n width: number\n height: number\n}\n\n//\n\nconst getRect = (element: HTMLElement): Rect => {\n const { offsetWidth, offsetHeight } = element\n return { width: offsetWidth, height: offsetHeight }\n}\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nexport const observeElementRect = <T extends Element>(\n instance: Virtualizer<T, any>,\n cb: (rect: Rect) => void,\n) => {\n const element = instance.scrollElement\n if (!element) {\n return\n }\n const targetWindow = instance.targetWindow\n if (!targetWindow) {\n return\n }\n\n const handler = (rect: Rect) => {\n const { width, height } = rect\n cb({ width: Math.round(width), height: Math.round(height) })\n }\n\n handler(getRect(element as unknown as HTMLElement))\n\n if (!targetWindow.ResizeObserver) {\n return () => {}\n }\n\n const observer = new targetWindow.ResizeObserver((entries) => {\n const run = () => {\n const entry = entries[0]\n if (entry?.borderBoxSize) {\n const box = entry.borderBoxSize[0]\n if (box) {\n handler({ width: box.inlineSize, height: box.blockSize })\n return\n }\n }\n handler(getRect(element as unknown as HTMLElement))\n }\n\n instance.options.useAnimationFrameWithResizeObserver\n ? requestAnimationFrame(run)\n : run()\n })\n\n observer.observe(element, { box: 'border-box' })\n\n return () => {\n observer.unobserve(element)\n }\n}\n\nconst addEventListenerOptions = {\n passive: true,\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<Window, any>,\n cb: (rect: Rect) => void,\n) => {\n const element = instance.scrollElement\n if (!element) {\n return\n }\n\n const handler = () => {\n cb({ width: element.innerWidth, height: element.innerHeight })\n }\n handler()\n\n element.addEventListener('resize', handler, addEventListenerOptions)\n\n return () => {\n element.removeEventListener('resize', handler)\n }\n}\n\nconst supportsScrollend =\n typeof window == 'undefined' ? true : 'onscrollend' in window\n\ntype ObserveOffsetCallBack = (offset: number, isScrolling: boolean) => void\n\nexport const observeElementOffset = <T extends Element>(\n instance: Virtualizer<T, any>,\n cb: ObserveOffsetCallBack,\n) => {\n const element = instance.scrollElement\n if (!element) {\n return\n }\n const targetWindow = instance.targetWindow\n if (!targetWindow) {\n return\n }\n\n let offset = 0\n const fallback =\n instance.options.useScrollendEvent && supportsScrollend\n ? () => undefined\n : debounce(\n targetWindow,\n () => {\n cb(offset, false)\n },\n instance.options.isScrollingResetDelay,\n )\n\n const createHandler = (isScrolling: boolean) => () => {\n const { horizontal, isRtl } = instance.options\n offset = horizontal\n ? element['scrollLeft'] * ((isRtl && -1) || 1)\n : element['scrollTop']\n fallback()\n cb(offset, isScrolling)\n }\n const handler = createHandler(true)\n const endHandler = createHandler(false)\n\n element.addEventListener('scroll', handler, addEventListenerOptions)\n const registerScrollendEvent =\n instance.options.useScrollendEvent && supportsScrollend\n if (registerScrollendEvent) {\n element.addEventListener('scrollend', endHandler, addEventListenerOptions)\n }\n return () => {\n element.removeEventListener('scroll', handler)\n if (registerScrollendEvent) {\n element.removeEventListener('scrollend', endHandler)\n }\n }\n}\n\nexport const observeWindowOffset = (\n instance: Virtualizer<Window, any>,\n cb: ObserveOffsetCallBack,\n) => {\n const element = instance.scrollElement\n if (!element) {\n return\n }\n const targetWindow = instance.targetWindow\n if (!targetWindow) {\n return\n }\n\n let offset = 0\n const fallback =\n instance.options.useScrollendEvent && supportsScrollend\n ? () => undefined\n : debounce(\n targetWindow,\n () => {\n cb(offset, false)\n },\n instance.options.isScrollingResetDelay,\n )\n\n const createHandler = (isScrolling: boolean) => () => {\n offset = element[instance.options.horizontal ? 'scrollX' : 'scrollY']\n fallback()\n cb(offset, isScrolling)\n }\n const handler = createHandler(true)\n const endHandler = createHandler(false)\n\n element.addEventListener('scroll', handler, addEventListenerOptions)\n const registerScrollendEvent =\n instance.options.useScrollendEvent && supportsScrollend\n if (registerScrollendEvent) {\n element.addEventListener('scrollend', endHandler, addEventListenerOptions)\n }\n return () => {\n element.removeEventListener('scroll', handler)\n if (registerScrollendEvent) {\n element.removeEventListener('scrollend', endHandler)\n }\n }\n}\n\nexport const measureElement = <TItemElement extends Element>(\n element: TItemElement,\n entry: ResizeObserverEntry | undefined,\n instance: Virtualizer<any, TItemElement>,\n) => {\n if (entry?.borderBoxSize) {\n const box = entry.borderBoxSize[0]\n if (box) {\n const size = Math.round(\n box[instance.options.horizontal ? 'inlineSize' : 'blockSize'],\n )\n return size\n }\n }\n\n return (element as unknown as HTMLElement)[\n instance.options.horizontal ? 'offsetWidth' : 'offsetHeight'\n ]\n}\n\nexport const windowScroll = <T extends Window>(\n offset: number,\n {\n adjustments = 0,\n behavior,\n }: { adjustments?: number; behavior?: ScrollBehavior },\n instance: Virtualizer<T, any>,\n) => {\n const toOffset = offset + adjustments\n\n instance.scrollElement?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior,\n })\n}\n\nexport const elementScroll = <T extends Element>(\n offset: number,\n {\n adjustments = 0,\n behavior,\n }: { adjustments?: number; behavior?: ScrollBehavior },\n instance: Virtualizer<T, any>,\n) => {\n const toOffset = offset + adjustments\n\n instance.scrollElement?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement extends Element | Window,\n TItemElement extends Element,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement | null\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n options: { adjustments?: number; behavior?: ScrollBehavior },\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: ObserveOffsetCallBack,\n ) => void | (() => void)\n // Optional\n debug?: boolean\n initialRect?: Rect\n onChange?: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n sync: boolean,\n ) => void\n measureElement?: (\n element: TItemElement,\n entry: ResizeObserverEntry | undefined,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n scrollPaddingStart?: number\n scrollPaddingEnd?: number\n initialOffset?: number | (() => number)\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => Array<number>\n scrollMargin?: number\n gap?: number\n indexAttribute?: string\n initialMeasurementsCache?: Array<VirtualItem>\n lanes?: number\n isScrollingResetDelay?: number\n useScrollendEvent?: boolean\n enabled?: boolean\n isRtl?: boolean\n useAnimationFrameWithResizeObserver?: boolean\n}\n\ntype ScrollState = {\n // what we want\n index: number | null\n align: ScrollAlignment\n behavior: ScrollBehavior\n\n // lifecycle\n startedAt: number\n\n // target tracking\n lastTargetOffset: number\n\n // settling\n stableFrames: number\n}\n\nexport class Virtualizer<\n TScrollElement extends Element | Window,\n TItemElement extends Element,\n> {\n private unsubs: Array<void | (() => void)> = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n targetWindow: (Window & typeof globalThis) | null = null\n isScrolling = false\n private scrollState: ScrollState | null = null\n measurementsCache: Array<VirtualItem> = []\n private itemSizeCache = new Map<Key, number>()\n private laneAssignments = new Map<number, number>() // index → lane cache\n private pendingMeasuredCacheIndexes: Array<number> = []\n private prevLanes: number | undefined = undefined\n private lanesChangedFlag = false\n private lanesSettling = false\n scrollRect: Rect | null = null\n scrollOffset: number | null = null\n scrollDirection: ScrollDirection | null = null\n private scrollAdjustments = 0\n shouldAdjustScrollPositionOnItemSizeChange:\n | undefined\n | ((\n item: VirtualItem,\n delta: number,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => boolean)\n elementsCache = new Map<Key, TItemElement>()\n private now = () => this.targetWindow?.performance?.now?.() ?? Date.now()\n private observer = (() => {\n let _ro: ResizeObserver | null = null\n\n const get = () => {\n if (_ro) {\n return _ro\n }\n\n if (!this.targetWindow || !this.targetWindow.ResizeObserver) {\n return null\n }\n\n return (_ro = new this.targetWindow.ResizeObserver((entries) => {\n entries.forEach((entry) => {\n const run = () => {\n const node = entry.target as TItemElement\n const index = this.indexFromElement(node)\n\n if (!node.isConnected) {\n this.observer.unobserve(node)\n return\n }\n\n if (this.shouldMeasureDuringScroll(index)) {\n this.resizeItem(\n index,\n this.options.measureElement(node, entry, this),\n )\n }\n }\n this.options.useAnimationFrameWithResizeObserver\n ? requestAnimationFrame(run)\n : run()\n })\n }))\n }\n\n return {\n disconnect: () => {\n get()?.disconnect()\n _ro = null\n },\n observe: (target: Element) =>\n get()?.observe(target, { box: 'border-box' }),\n unobserve: (target: Element) => get()?.unobserve(target),\n }\n })()\n range: { startIndex: number; endIndex: number } | null = null\n\n constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {\n this.setOptions(opts)\n }\n\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n gap: 0,\n indexAttribute: 'data-index',\n initialMeasurementsCache: [],\n lanes: 1,\n isScrollingResetDelay: 150,\n enabled: true,\n isRtl: false,\n useScrollendEvent: false,\n useAnimationFrameWithResizeObserver: false,\n ...opts,\n }\n }\n\n private notify = (sync: boolean) => {\n this.options.onChange?.(this, sync)\n }\n\n private maybeNotify = memo(\n () => {\n this.calculateRange()\n\n return [\n this.isScrolling,\n this.range ? this.range.startIndex : null,\n this.range ? this.range.endIndex : null,\n ]\n },\n (isScrolling) => {\n this.notify(isScrolling)\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'maybeNotify',\n debug: () => this.options.debug,\n initialDeps: [\n this.isScrolling,\n this.range ? this.range.startIndex : null,\n this.range ? this.range.endIndex : null,\n ] as [boolean, number | null, number | null],\n },\n )\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n this.observer.disconnect()\n if (this.rafId != null && this.targetWindow) {\n this.targetWindow.cancelAnimationFrame(this.rafId)\n this.rafId = null\n }\n this.scrollState = null\n this.scrollElement = null\n this.targetWindow = null\n }\n\n _didMount = () => {\n return () => {\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.enabled\n ? this.options.getScrollElement()\n : null\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n if (!scrollElement) {\n this.maybeNotify()\n return\n }\n\n this.scrollElement = scrollElement\n\n if (this.scrollElement && 'ownerDocument' in this.scrollElement) {\n this.targetWindow = this.scrollElement.ownerDocument.defaultView\n } else {\n this.targetWindow = this.scrollElement?.window ?? null\n }\n\n this.elementsCache.forEach((cached) => {\n this.observer.observe(cached)\n })\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.maybeNotify()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset, isScrolling) => {\n this.scrollAdjustments = 0\n this.scrollDirection = isScrolling\n ? this.getScrollOffset() < offset\n ? 'forward'\n : 'backward'\n : null\n this.scrollOffset = offset\n this.isScrolling = isScrolling\n\n if (this.scrollState) {\n this.scheduleScrollReconcile()\n }\n this.maybeNotify()\n }),\n )\n\n this._scrollToOffset(this.getScrollOffset(), {\n adjustments: undefined,\n behavior: undefined,\n })\n }\n }\n\n private rafId: number | null = null\n private scheduleScrollReconcile() {\n if (!this.targetWindow) {\n this.scrollState = null\n return\n }\n if (this.rafId != null) return\n this.rafId = this.targetWindow.requestAnimationFrame(() => {\n this.rafId = null\n this.reconcileScroll()\n })\n }\n private reconcileScroll() {\n if (!this.scrollState) return\n\n const el = this.scrollElement\n if (!el) return\n\n // Safety valve: bail out if reconciliation has been running too long\n const MAX_RECONCILE_MS = 5000\n if (this.now() - this.scrollState.startedAt > MAX_RECONCILE_MS) {\n this.scrollState = null\n return\n }\n\n const offsetInfo =\n this.scrollState.index != null\n ? this.getOffsetForIndex(this.scrollState.index, this.scrollState.align)\n : undefined\n const targetOffset = offsetInfo\n ? offsetInfo[0]\n : this.scrollState.lastTargetOffset\n\n // Require one stable frame where target matches scroll offset.\n // approxEqual() already tolerates minor fluctuations, so one frame is sufficient\n // to confirm scroll has reached its target without premature cleanup.\n const STABLE_FRAMES = 1\n\n const targetChanged = targetOffset !== this.scrollState.lastTargetOffset\n\n if (!targetChanged && approxEqual(targetOffset, this.getScrollOffset())) {\n this.scrollState.stableFrames++\n if (this.scrollState.stableFrames >= STABLE_FRAMES) {\n this.scrollState = null\n return\n }\n } else {\n this.scrollState.stableFrames = 0\n\n if (targetChanged) {\n this.scrollState.lastTargetOffset = targetOffset\n // Switch to 'auto' behavior once measurements cause target to change\n // We want to jump directly to the correct position, not smoothly animate to it\n this.scrollState.behavior = 'auto'\n\n this._scrollToOffset(targetOffset, {\n adjustments: undefined,\n behavior: 'auto',\n })\n }\n }\n\n // Always reschedule while scrollState is active to guarantee\n // the safety valve timeout runs even if no scroll events fire\n // (e.g. no-op scrollToFn, detached element)\n this.scheduleScrollReconcile()\n }\n\n private getSize = () => {\n if (!this.options.enabled) {\n this.scrollRect = null\n return 0\n }\n\n this.scrollRect = this.scrollRect ?? this.options.initialRect\n\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getScrollOffset = () => {\n if (!this.options.enabled) {\n this.scrollOffset = null\n return 0\n }\n\n this.scrollOffset =\n this.scrollOffset ??\n (typeof this.options.initialOffset === 'function'\n ? this.options.initialOffset()\n : this.options.initialOffset)\n\n return this.scrollOffset\n }\n\n private getFurthestMeasurement = (\n measurements: Array<VirtualItem>,\n index: number,\n ) => {\n const furthestMeasurementsFound = new Map<number, true>()\n const furthestMeasurements = new Map<number, VirtualItem>()\n for (let m = index - 1; m >= 0; m--) {\n const measurement = measurements[m]!\n\n if (furthestMeasurementsFound.has(measurement.lane)) {\n continue\n }\n\n const previousFurthestMeasurement = furthestMeasurements.get(\n measurement.lane,\n )\n if (\n previousFurthestMeasurement == null ||\n measurement.end > previousFurthestMeasurement.end\n ) {\n furthestMeasurements.set(measurement.lane, measurement)\n } else if (measurement.end < previousFurthestMeasurement.end) {\n furthestMeasurementsFound.set(measurement.lane, true)\n }\n\n if (furthestMeasurementsFound.size === this.options.lanes) {\n break\n }\n }\n\n return furthestMeasurements.size === this.options.lanes\n ? Array.from(furthestMeasurements.values()).sort((a, b) => {\n if (a.end === b.end) {\n return a.index - b.index\n }\n\n return a.end - b.end\n })[0]\n : undefined\n }\n\n private getMeasurementOptions = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.scrollMargin,\n this.options.getItemKey,\n this.options.enabled,\n this.options.lanes,\n ],\n (count, paddingStart, scrollMargin, getItemKey, enabled, lanes) => {\n const lanesChanged =\n this.prevLanes !== undefined && this.prevLanes !== lanes\n\n if (lanesChanged) {\n // Set flag for getMeasurements to handle\n this.lanesChangedFlag = true\n }\n\n this.prevLanes = lanes\n this.pendingMeasuredCacheIndexes = []\n\n return {\n count,\n paddingStart,\n scrollMargin,\n getItemKey,\n enabled,\n lanes,\n }\n },\n {\n key: false,\n },\n )\n\n private getMeasurements = memo(\n () => [this.getMeasurementOptions(), this.itemSizeCache],\n (\n { count, paddingStart, scrollMargin, getItemKey, enabled, lanes },\n itemSizeCache,\n ) => {\n if (!enabled) {\n this.measurementsCache = []\n this.itemSizeCache.clear()\n this.laneAssignments.clear()\n return []\n }\n\n // Clean up stale lane cache entries when count decreases\n if (this.laneAssignments.size > count) {\n for (const index of this.laneAssignments.keys()) {\n if (index >= count) {\n this.laneAssignments.delete(index)\n }\n }\n }\n\n // ✅ Force complete recalculation when lanes change\n if (this.lanesChangedFlag) {\n this.lanesChangedFlag = false // Reset immediately\n this.lanesSettling = true // Start settling period\n this.measurementsCache = []\n this.itemSizeCache.clear()\n this.laneAssignments.clear() // Clear lane cache for new lane count\n // Clear pending indexes to force min = 0\n this.pendingMeasuredCacheIndexes = []\n }\n\n // Don't restore from initialMeasurementsCache during lane changes\n // as it contains stale lane assignments from the previous lane count\n if (this.measurementsCache.length === 0 && !this.lanesSettling) {\n this.measurementsCache = this.options.initialMeasurementsCache\n this.measurementsCache.forEach((item) => {\n this.itemSizeCache.set(item.key, item.size)\n })\n }\n\n // ✅ During lanes settling, ignore pendingMeasuredCacheIndexes to prevent repositioning\n const min = this.lanesSettling\n ? 0\n : this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n // ✅ End settling period when cache is fully built\n if (this.lanesSettling && this.measurementsCache.length === count) {\n this.lanesSettling = false\n }\n\n const measurements = this.measurementsCache.slice(0, min)\n\n // ✅ Performance: Track last item index per lane for O(1) lookup\n const laneLastIndex: Array<number | undefined> = new Array(lanes).fill(\n undefined,\n )\n\n // Initialize from existing measurements (before min)\n for (let m = 0; m < min; m++) {\n const item = measurements[m]\n if (item) {\n laneLastIndex[item.lane] = m\n }\n }\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n\n // Check for cached lane assignment\n const cachedLane = this.laneAssignments.get(i)\n let lane: number\n let start: number\n\n if (cachedLane !== undefined && this.options.lanes > 1) {\n // Use cached lane - O(1) lookup for previous item in same lane\n lane = cachedLane\n const prevIndex = laneLastIndex[lane]\n const prevInLane =\n prevIndex !== undefined ? measurements[prevIndex] : undefined\n start = prevInLane\n ? prevInLane.end + this.options.gap\n : paddingStart + scrollMargin\n } else {\n // No cache - use original logic (find shortest lane)\n const furthestMeasurement =\n this.options.lanes === 1\n ? measurements[i - 1]\n : this.getFurthestMeasurement(measurements, i)\n\n start = furthestMeasurement\n ? furthestMeasurement.end + this.options.gap\n : paddingStart + scrollMargin\n\n lane = furthestMeasurement\n ? furthestMeasurement.lane\n : i % this.options.lanes\n\n // Cache the lane assignment\n if (this.options.lanes > 1) {\n this.laneAssignments.set(i, lane)\n }\n }\n\n const measuredSize = itemSizeCache.get(key)\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n\n const end = start + size\n\n measurements[i] = {\n index: i,\n start,\n size,\n end,\n key,\n lane,\n }\n\n // ✅ Performance: Update lane's last item index\n laneLastIndex[lane] = i\n }\n\n this.measurementsCache = measurements\n\n return measurements\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n calculateRange = memo(\n () => [\n this.getMeasurements(),\n this.getSize(),\n this.getScrollOffset(),\n this.options.lanes,\n ],\n (measurements, outerSize, scrollOffset, lanes) => {\n return (this.range =\n measurements.length > 0 && outerSize > 0\n ? calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n lanes,\n })\n : null)\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n getVirtualIndexes = memo(\n () => {\n let startIndex: number | null = null\n let endIndex: number | null = null\n const range = this.calculateRange()\n if (range) {\n startIndex = range.startIndex\n endIndex = range.endIndex\n }\n this.maybeNotify.updateDeps([this.isScrolling, startIndex, endIndex])\n return [\n this.options.rangeExtractor,\n this.options.overscan,\n this.options.count,\n startIndex,\n endIndex,\n ]\n },\n (rangeExtractor, overscan, count, startIndex, endIndex) => {\n return startIndex === null || endIndex === null\n ? []\n : rangeExtractor({\n startIndex,\n endIndex,\n overscan,\n count,\n })\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getVirtualIndexes',\n debug: () => this.options.debug,\n },\n )\n\n indexFromElement = (node: TItemElement) => {\n const attributeName = this.options.indexAttribute\n const indexStr = node.getAttribute(attributeName)\n\n if (!indexStr) {\n console.warn(\n `Missing attribute name '${attributeName}={index}' on measured element.`,\n )\n return -1\n }\n\n return parseInt(indexStr, 10)\n }\n\n /**\n * Determines if an item at the given index should be measured during smooth scroll.\n * During smooth scroll, only items within a buffer range around the target are measured\n * to prevent items far from the target from pushing it away.\n */\n private shouldMeasureDuringScroll = (index: number): boolean => {\n // No scroll state or not smooth scroll - always allow measurements\n if (!this.scrollState || this.scrollState.behavior !== 'smooth') {\n return true\n }\n\n const scrollIndex =\n this.scrollState.index ??\n this.getVirtualItemForOffset(this.scrollState.lastTargetOffset)?.index\n\n if (scrollIndex !== undefined && this.range) {\n // Allow measurements within a buffer range around the scroll target\n const bufferSize = Math.max(\n this.options.overscan,\n Math.ceil((this.range.endIndex - this.range.startIndex) / 2),\n )\n const minIndex = Math.max(0, scrollIndex - bufferSize)\n const maxIndex = Math.min(\n this.options.count - 1,\n scrollIndex + bufferSize,\n )\n return index >= minIndex && index <= maxIndex\n }\n\n return true\n }\n\n measureElement = (node: TItemElement | null) => {\n if (!node) {\n this.elementsCache.forEach((cached, key) => {\n if (!cached.isConnected) {\n this.observer.unobserve(cached)\n this.elementsCache.delete(key)\n }\n })\n return\n }\n\n const index = this.indexFromElement(node)\n const key = this.options.getItemKey(index)\n const prevNode = this.elementsCache.get(key)\n\n if (prevNode !== node) {\n if (prevNode) {\n this.observer.unobserve(prevNode)\n }\n this.observer.observe(node)\n this.elementsCache.set(key, node)\n }\n\n // Sync-measure when idle (initial render) or during programmatic scrolling\n // (scrollToIndex/scrollToOffset) where reconcileScroll needs sizes in the same frame.\n // During normal user scrolling, skip sync measurement — the RO callback handles it async.\n if (\n (!this.isScrolling || this.scrollState) &&\n this.shouldMeasureDuringScroll(index)\n ) {\n this.resizeItem(index, this.options.measureElement(node, undefined, this))\n }\n }\n\n resizeItem = (index: number, size: number) => {\n const item = this.measurementsCache[index]\n if (!item) return\n\n const itemSize = this.itemSizeCache.get(item.key) ?? item.size\n const delta = size - itemSize\n\n if (delta !== 0) {\n if (\n this.scrollState?.behavior !== 'smooth' &&\n (this.shouldAdjustScrollPositionOnItemSizeChange !== undefined\n ? this.shouldAdjustScrollPositionOnItemSizeChange(item, delta, this)\n : item.start < this.getScrollOffset() + this.scrollAdjustments)\n ) {\n if (process.env.NODE_ENV !== 'production' && this.options.debug) {\n console.info('correction', delta)\n }\n this._scrollToOffset(this.getScrollOffset(), {\n adjustments: (this.scrollAdjustments += delta),\n behavior: undefined,\n })\n }\n\n this.pendingMeasuredCacheIndexes.push(item.index)\n this.itemSizeCache = new Map(this.itemSizeCache.set(item.key, size))\n\n this.notify(false)\n }\n }\n\n getVirtualItems = memo(\n () => [this.getVirtualIndexes(), this.getMeasurements()],\n (indexes, measurements) => {\n const virtualItems: Array<VirtualItem> = []\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n virtualItems.push(measurement)\n }\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getVirtualItems',\n debug: () => this.options.debug,\n },\n )\n\n getVirtualItemForOffset = (offset: number) => {\n const measurements = this.getMeasurements()\n if (measurements.length === 0) {\n return undefined\n }\n return notUndefined(\n measurements[\n findNearestBinarySearch(\n 0,\n measurements.length - 1,\n (index: number) => notUndefined(measurements[index]).start,\n offset,\n )\n ],\n )\n }\n\n private getMaxScrollOffset = () => {\n if (!this.scrollElement) return 0\n\n if ('scrollHeight' in this.scrollElement) {\n // Element\n return this.options.horizontal\n ? this.scrollElement.scrollWidth - this.scrollElement.clientWidth\n : this.scrollElement.scrollHeight - this.scrollElement.clientHeight\n } else {\n // Window\n const doc = this.scrollElement.document.documentElement\n return this.options.horizontal\n ? doc.scrollWidth - this.scrollElement.innerWidth\n : doc.scrollHeight - this.scrollElement.innerHeight\n }\n }\n\n getOffsetForAlignment = (\n toOffset: number,\n align: ScrollAlignment,\n itemSize = 0,\n ) => {\n if (!this.scrollElement) return 0\n\n const size = this.getSize()\n const scrollOffset = this.getScrollOffset()\n\n if (align === 'auto') {\n align = toOffset >= scrollOffset + size ? 'end' : 'start'\n }\n\n if (align === 'center') {\n // When aligning to a particular item (e.g. with scrollToIndex),\n // adjust offset by the size of the item to center on the item\n toOffset += (itemSize - size) / 2\n } else if (align === 'end') {\n toOffset -= size\n }\n\n const maxOffset = this.getMaxScrollOffset()\n\n return Math.max(Math.min(maxOffset, toOffset), 0)\n }\n\n getOffsetForIndex = (index: number, align: ScrollAlignment = 'auto') => {\n index = Math.max(0, Math.min(index, this.options.count - 1))\n\n const size = this.getSize()\n const scrollOffset = this.getScrollOffset()\n\n const item = this.measurementsCache[index]\n if (!item) return\n\n if (align === 'auto') {\n if (item.end >= scrollOffset + size - this.options.scrollPaddingEnd) {\n align = 'end'\n } else if (item.start <= scrollOffset + this.options.scrollPaddingStart) {\n align = 'start'\n } else {\n return [scrollOffset, align] as const\n }\n }\n\n // For the last item with 'end' alignment, use browser's actual max scroll\n // to account for borders/padding that aren't in our measurements\n if (align === 'end' && index === this.options.count - 1) {\n return [this.getMaxScrollOffset(), align] as const\n }\n\n const toOffset =\n align === 'end'\n ? item.end + this.options.scrollPaddingEnd\n : item.start - this.options.scrollPaddingStart\n\n return [\n this.getOffsetForAlignment(toOffset, align, item.size),\n align,\n ] as const\n }\n\n scrollToOffset = (\n toOffset: number,\n { align = 'start', behavior = 'auto' }: ScrollToOffsetOptions = {},\n ) => {\n const offset = this.getOffsetForAlignment(toOffset, align)\n\n const now = this.now()\n this.scrollState = {\n index: null,\n align,\n behavior,\n startedAt: now,\n lastTargetOffset: offset,\n stableFrames: 0,\n }\n\n this._scrollToOffset(offset, { adjustments: undefined, behavior })\n\n this.scheduleScrollReconcile()\n }\n\n scrollToIndex = (\n index: number,\n {\n align: initialAlign = 'auto',\n behavior = 'auto',\n }: ScrollToIndexOptions = {},\n ) => {\n index = Math.max(0, Math.min(index, this.options.count - 1))\n\n const offsetInfo = this.getOffsetForIndex(index, initialAlign)\n if (!offsetInfo) {\n return\n }\n const [offset, align] = offsetInfo\n\n const now = this.now()\n this.scrollState = {\n index,\n align,\n behavior,\n startedAt: now,\n lastTargetOffset: offset,\n stableFrames: 0,\n }\n\n this._scrollToOffset(offset, { adjustments: undefined, behavior })\n\n this.scheduleScrollReconcile()\n }\n\n scrollBy = (\n delta: number,\n { behavior = 'auto' }: ScrollToOffsetOptions = {},\n ) => {\n const offset = this.getScrollOffset() + delta\n const now = this.now()\n\n this.scrollState = {\n index: null,\n align: 'start',\n behavior,\n startedAt: now,\n lastTargetOffset: offset,\n stableFrames: 0,\n }\n\n this._scrollToOffset(offset, { adjustments: undefined, behavior })\n\n this.scheduleScrollReconcile()\n }\n\n getTotalSize = () => {\n const measurements = this.getMeasurements()\n\n let end: number\n // If there are no measurements, set the end to paddingStart\n // If there is only one lane, use the last measurement's end\n // Otherwise find the maximum end value among all measurements\n if (measurements.length === 0) {\n end = this.options.paddingStart\n } else if (this.options.lanes === 1) {\n end = measurements[measurements.length - 1]?.end ?? 0\n } else {\n const endByLane = Array<number | null>(this.options.lanes).fill(null)\n let endIndex = measurements.length - 1\n while (endIndex >= 0 && endByLane.some((val) => val === null)) {\n const item = measurements[endIndex]!\n if (endByLane[item.lane] === null) {\n endByLane[item.lane] = item.end\n }\n\n endIndex--\n }\n\n end = Math.max(...endByLane.filter((val): val is number => val !== null))\n }\n\n return Math.max(\n end - this.options.scrollMargin + this.options.paddingEnd,\n 0,\n )\n }\n\n private _scrollToOffset = (\n offset: number,\n {\n adjustments,\n behavior,\n }: {\n adjustments: number | undefined\n behavior: ScrollBehavior | undefined\n },\n ) => {\n this.options.scrollToFn(offset, { behavior, adjustments }, this)\n }\n\n measure = () => {\n this.itemSizeCache = new Map()\n this.laneAssignments = new Map() // Clear lane cache for full re-layout\n this.notify(false)\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n lanes,\n}: {\n measurements: Array<VirtualItem>\n outerSize: number\n scrollOffset: number\n lanes: number\n}) {\n const lastIndex = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n // handle case when item count is less than or equal to lanes\n if (measurements.length <= lanes) {\n return {\n startIndex: 0,\n endIndex: lastIndex,\n }\n }\n\n let startIndex = findNearestBinarySearch(\n 0,\n lastIndex,\n getOffset,\n scrollOffset,\n )\n let endIndex = startIndex\n\n if (lanes === 1) {\n while (\n endIndex < lastIndex &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n } else if (lanes > 1) {\n // Expand forward until we include the visible items from all lanes\n // which are closer to the end of the virtualizer window\n const endPerLane = Array(lanes).fill(0)\n while (\n endIndex < lastIndex &&\n endPerLane.some((pos) => pos < scrollOffset + outerSize)\n ) {\n const item = measurements[endIndex]!\n endPerLane[item.lane] = item.end\n endIndex++\n }\n\n // Expand backward until we include all lanes' visible items\n // closer to the top\n const startPerLane = Array(lanes).fill(scrollOffset + outerSize)\n while (startIndex >= 0 && startPerLane.some((pos) => pos >= scrollOffset)) {\n const item = measurements[startIndex]!\n startPerLane[item.lane] = item.start\n startIndex--\n }\n\n // Align startIndex to the beginning of its lane\n startIndex = Math.max(0, startIndex - (startIndex % lanes))\n // Align endIndex to the end of its lane\n endIndex = Math.min(lastIndex, endIndex + (lanes - 1 - (endIndex % lanes)))\n }\n\n return { startIndex, endIndex }\n}\n","/// <reference types=\"resize-observer-browser\" />\n\nimport * as React from 'react';\nimport { useLayoutEffect } from '@radix-ui/react-use-layout-effect';\n\nfunction useSize(element: HTMLElement | null) {\n const [size, setSize] = React.useState<{ width: number; height: number } | undefined>(undefined);\n\n useLayoutEffect(() => {\n if (element) {\n // provide size as early as possible\n setSize({ width: element.offsetWidth, height: element.offsetHeight });\n\n const resizeObserver = new ResizeObserver((entries) => {\n if (!Array.isArray(entries)) {\n return;\n }\n\n // Since we only observe the one element, we don't need to loop over the\n // array\n if (!entries.length) {\n return;\n }\n\n const entry = entries[0];\n let width: number;\n let height: number;\n\n if ('borderBoxSize' in entry) {\n const borderSizeEntry = entry['borderBoxSize'];\n // iron out differences between browsers\n const borderSize = Array.isArray(borderSizeEntry) ? borderSizeEntry[0] : borderSizeEntry;\n width = borderSize['inlineSize'];\n height = borderSize['blockSize'];\n } else {\n // for browsers that don't support `borderBoxSize`\n // we calculate it ourselves to get the correct border box.\n width = element.offsetWidth;\n height = element.offsetHeight;\n }\n\n setSize({ width, height });\n });\n\n resizeObserver.observe(element, { box: 'border-box' });\n\n return () => resizeObserver.unobserve(element);\n } else {\n // We only want to reset to `undefined` when the element becomes `null`,\n // not if it changes to another element.\n setSize(undefined);\n }\n }, [element]);\n\n return size;\n}\n\nexport { useSize };\n","import * as React from 'react';\nimport { Primitive } from '@radix-ui/react-primitive';\n\n/* -------------------------------------------------------------------------------------------------\n * VisuallyHidden\n * -----------------------------------------------------------------------------------------------*/\n\nconst VISUALLY_HIDDEN_STYLES = Object.freeze({\n // See: https://github.com/twbs/bootstrap/blob/main/scss/mixins/_visually-hidden.scss\n position: 'absolute',\n border: 0,\n width: 1,\n height: 1,\n padding: 0,\n margin: -1,\n overflow: 'hidden',\n clip: 'rect(0, 0, 0, 0)',\n whiteSpace: 'nowrap',\n wordWrap: 'normal',\n}) satisfies React.CSSProperties;\n\nconst NAME = 'VisuallyHidden';\n\ntype VisuallyHiddenElement = React.ComponentRef<typeof Primitive.span>;\ntype PrimitiveSpanProps = React.ComponentPropsWithoutRef<typeof Primitive.span>;\ninterface VisuallyHiddenProps extends PrimitiveSpanProps {}\n\nconst VisuallyHidden = React.forwardRef<VisuallyHiddenElement, VisuallyHiddenProps>(\n (props, forwardedRef) => {\n return (\n <Primitive.span\n {...props}\n ref={forwardedRef}\n style={{ ...VISUALLY_HIDDEN_STYLES, ...props.style }}\n />\n );\n }\n);\n\nVisuallyHidden.displayName = NAME;\n\n/* -----------------------------------------------------------------------------------------------*/\n\nconst Root = VisuallyHidden;\n\nexport {\n VisuallyHidden,\n //\n Root,\n //\n VISUALLY_HIDDEN_STYLES,\n};\nexport type { VisuallyHiddenProps };\n","import * as React from 'react';\nimport { Primitive } from '@radix-ui/react-primitive';\n\n/* -------------------------------------------------------------------------------------------------\n * Arrow\n * -----------------------------------------------------------------------------------------------*/\n\nconst NAME = 'Arrow';\n\ntype ArrowElement = React.ComponentRef<typeof Primitive.svg>;\ntype PrimitiveSvgProps = React.ComponentPropsWithoutRef<typeof Primitive.svg>;\ninterface ArrowProps extends PrimitiveSvgProps {}\n\nconst Arrow = React.forwardRef<ArrowElement, ArrowProps>((props, forwardedRef) => {\n const { children, width = 10, height = 5, ...arrowProps } = props;\n return (\n <Primitive.svg\n {...arrowProps}\n ref={forwardedRef}\n width={width}\n height={height}\n viewBox=\"0 0 30 10\"\n preserveAspectRatio=\"none\"\n >\n {/* We use their children if they're slotting to replace the whole svg */}\n {props.asChild ? children : <polygon points=\"0,0 30,0 15,10\" />}\n </Primitive.svg>\n );\n});\n\nArrow.displayName = NAME;\n\n/* -----------------------------------------------------------------------------------------------*/\n\nconst Root = Arrow;\n\nexport {\n Arrow,\n //\n Root,\n};\nexport type { ArrowProps };\n","import * as React from 'react';\nimport { composeRefs } from '@radix-ui/react-compose-refs';\n\n/* -------------------------------------------------------------------------------------------------\n * Slot\n * -----------------------------------------------------------------------------------------------*/\n\ninterface SlotProps extends React.HTMLAttributes<HTMLElement> {\n children?: React.ReactNode;\n}\n\n/* @__NO_SIDE_EFFECTS__ */ export function createSlot(ownerName: string) {\n const SlotClone = createSlotClone(ownerName);\n const Slot = React.forwardRef<HTMLElement, SlotProps>((props, forwardedRef) => {\n const { children, ...slotProps } = props;\n const childrenArray = React.Children.toArray(children);\n const slottable = childrenArray.find(isSlottable);\n\n if (slottable) {\n // the new element to render is the one passed as a child of `Slottable`\n const newElement = slottable.props.children;\n\n const newChildren = childrenArray.map((child) => {\n if (child === slottable) {\n // because the new element will be the one rendered, we are only interested\n // in grabbing its children (`newElement.props.children`)\n if (React.Children.count(newElement) > 1) return React.Children.only(null);\n return React.isValidElement(newElement)\n ? (newElement.props as { children: React.ReactNode }).children\n : null;\n } else {\n return child;\n }\n });\n\n return (\n <SlotClone {...slotProps} ref={forwardedRef}>\n {React.isValidElement(newElement)\n ? React.cloneElement(newElement, undefined, newChildren)\n : null}\n </SlotClone>\n );\n }\n\n return (\n <SlotClone {...slotProps} ref={forwardedRef}>\n {children}\n </SlotClone>\n );\n });\n\n Slot.displayName = `${ownerName}.Slot`;\n return Slot;\n}\n\nconst Slot = createSlot('Slot');\n\n/* -------------------------------------------------------------------------------------------------\n * SlotClone\n * -----------------------------------------------------------------------------------------------*/\n\ninterface SlotCloneProps {\n children: React.ReactNode;\n}\n\n/* @__NO_SIDE_EFFECTS__ */ function createSlotClone(ownerName: string) {\n const SlotClone = React.forwardRef<any, SlotCloneProps>((props, forwardedRef) => {\n const { children, ...slotProps } = props;\n\n if (React.isValidElement(children)) {\n const childrenRef = getElementRef(children);\n const props = mergeProps(slotProps, children.props as AnyProps);\n // do not pass ref to React.Fragment for React 19 compatibility\n if (children.type !== React.Fragment) {\n props.ref = forwardedRef ? composeRefs(forwardedRef, childrenRef) : childrenRef;\n }\n return React.cloneElement(children, props);\n }\n\n return React.Children.count(children) > 1 ? React.Children.only(null) : null;\n });\n\n SlotClone.displayName = `${ownerName}.SlotClone`;\n return SlotClone;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Slottable\n * -----------------------------------------------------------------------------------------------*/\n\nconst SLOTTABLE_IDENTIFIER = Symbol('radix.slottable');\n\ninterface SlottableProps {\n children: React.ReactNode;\n}\n\ninterface SlottableComponent extends React.FC<SlottableProps> {\n __radixId: symbol;\n}\n\n/* @__NO_SIDE_EFFECTS__ */ export function createSlottable(ownerName: string) {\n const Slottable: SlottableComponent = ({ children }) => {\n return <>{children}</>;\n };\n Slottable.displayName = `${ownerName}.Slottable`;\n Slottable.__radixId = SLOTTABLE_IDENTIFIER;\n return Slottable;\n}\n\nconst Slottable = createSlottable('Slottable');\n\n/* ---------------------------------------------------------------------------------------------- */\n\ntype AnyProps = Record<string, any>;\n\nfunction isSlottable(\n child: React.ReactNode\n): child is React.ReactElement<SlottableProps, typeof Slottable> {\n return (\n React.isValidElement(child) &&\n typeof child.type === 'function' &&\n '__radixId' in child.type &&\n child.type.__radixId === SLOTTABLE_IDENTIFIER\n );\n}\n\nfunction mergeProps(slotProps: AnyProps, childProps: AnyProps) {\n // all child props should override\n const overrideProps = { ...childProps };\n\n for (const propName in childProps) {\n const slotPropValue = slotProps[propName];\n const childPropValue = childProps[propName];\n\n const isHandler = /^on[A-Z]/.test(propName);\n if (isHandler) {\n // if the handler exists on both, we compose them\n if (slotPropValue && childPropValue) {\n overrideProps[propName] = (...args: unknown[]) => {\n const result = childPropValue(...args);\n slotPropValue(...args);\n return result;\n };\n }\n // but if it exists only on the slot, we use only this one\n else if (slotPropValue) {\n overrideProps[propName] = slotPropValue;\n }\n }\n // if it's `style`, we merge them\n else if (propName === 'style') {\n overrideProps[propName] = { ...slotPropValue, ...childPropValue };\n } else if (propName === 'className') {\n overrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(' ');\n }\n }\n\n return { ...slotProps, ...overrideProps };\n}\n\n// Before React 19 accessing `element.props.ref` will throw a warning and suggest using `element.ref`\n// After React 19 accessing `element.ref` does the opposite.\n// https://github.com/facebook/react/pull/28348\n//\n// Access the ref using the method that doesn't yield a warning.\nfunction getElementRef(element: React.ReactElement) {\n // React <=18 in DEV\n let getter = Object.getOwnPropertyDescriptor(element.props, 'ref')?.get;\n let mayWarn = getter && 'isReactWarning' in getter && getter.isReactWarning;\n if (mayWarn) {\n return (element as any).ref;\n }\n\n // React 19 in DEV\n getter = Object.getOwnPropertyDescriptor(element, 'ref')?.get;\n mayWarn = getter && 'isReactWarning' in getter && getter.isReactWarning;\n if (mayWarn) {\n return (element.props as { ref?: React.Ref<unknown> }).ref;\n }\n\n // Not DEV\n return (element.props as { ref?: React.Ref<unknown> }).ref || (element as any).ref;\n}\n\nexport {\n Slot,\n Slottable,\n //\n Slot as Root,\n};\nexport type { SlotProps };\n","// src/arrow.tsx\nimport * as React from \"react\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { jsx } from \"react/jsx-runtime\";\nvar NAME = \"Arrow\";\nvar Arrow = React.forwardRef((props, forwardedRef) => {\n const { children, width = 10, height = 5, ...arrowProps } = props;\n return /* @__PURE__ */ jsx(\n Primitive.svg,\n {\n ...arrowProps,\n ref: forwardedRef,\n width,\n height,\n viewBox: \"0 0 30 10\",\n preserveAspectRatio: \"none\",\n children: props.asChild ? children : /* @__PURE__ */ jsx(\"polygon\", { points: \"0,0 30,0 15,10\" })\n }\n );\n});\nArrow.displayName = NAME;\nvar Root = Arrow;\nexport {\n Arrow,\n Root\n};\n//# sourceMappingURL=index.mjs.map\n","import { cn } from \"@/lib/cn\";\n\nexport function Card({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\n \"rounded-xl border border-card-border bg-card text-card-foreground shadow-sm transition-all duration-200 hover:bg-[var(--card-hover)] hover:border-[var(--border-hover)] hover:shadow-md\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport function CardHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn(\"flex flex-col space-y-1.5 p-4\", className)} {...props} />;\n}\n\nexport function CardContent({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn(\"p-4 pt-0\", className)} {...props} />;\n}\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/lib/cn\";\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-full px-2.5 py-1 text-[11px] font-medium uppercase tracking-[0.08em] ring-1 ring-inset transition-all duration-200\",\n {\n variants: {\n variant: {\n default: \"bg-muted text-foreground-secondary ring-border\",\n success: \"bg-success-muted text-success ring-success/20 shadow-neon-glow-success-sm\",\n error: \"bg-error-muted text-error ring-error/20 shadow-neon-glow-error-sm\",\n warning: \"bg-warning-muted text-warning ring-warning/20 shadow-neon-glow-warning-badge\",\n info: \"bg-info-muted text-info ring-info/20 shadow-neon-glow-cyan-sm\",\n pending: \"bg-pending-muted text-pending ring-pending/20\",\n },\n },\n defaultVariants: { variant: \"default\" },\n }\n);\n\ninterface BadgeProps extends React.HTMLAttributes<HTMLSpanElement>, VariantProps<typeof badgeVariants> {}\n\nexport function Badge({ className, variant, ...props }: BadgeProps) {\n return <span className={cn(badgeVariants({ variant }), className)} {...props} />;\n}\n","import { cn } from \"@/lib/cn\";\r\nimport { Badge } from \"@/components/ui/badge\";\r\nimport type { RunStatus, TaskStatus } from \"@/types\";\r\nimport { CheckCircle2, XCircle, Clock, Loader2, Circle, Hand } from \"lucide-react\";\r\n\r\nconst iconSize = \"h-3.5 w-3.5\";\r\n\r\nconst statusConfig: Record<string, { variant: \"success\" | \"error\" | \"warning\" | \"info\" | \"pending\"; icon: React.ReactNode; label: string; extraClass?: string }> = {\r\n completed: {\r\n variant: \"success\",\r\n icon: <CheckCircle2 className={cn(iconSize, \"drop-shadow-[var(--drop-glow-success)]\")} />,\r\n label: \"Completed\",\r\n extraClass: \"ring-success/30 shadow-neon-glow-success-sm\",\r\n },\r\n resolved: {\r\n variant: \"success\",\r\n icon: <CheckCircle2 className={cn(iconSize, \"drop-shadow-[var(--drop-glow-success)]\")} />,\r\n label: \"Done\",\r\n extraClass: \"ring-success/30 shadow-neon-glow-success-sm\",\r\n },\r\n ok: {\r\n variant: \"success\",\r\n icon: <CheckCircle2 className={cn(iconSize, \"drop-shadow-[var(--drop-glow-success)]\")} />,\r\n label: \"OK\",\r\n extraClass: \"ring-success/30 shadow-neon-glow-success-sm\",\r\n },\r\n failed: {\r\n variant: \"error\",\r\n icon: <XCircle className={cn(iconSize, \"drop-shadow-[var(--drop-glow-error)]\")} />,\r\n label: \"Failed\",\r\n extraClass: \"ring-error/30 shadow-neon-glow-error-sm\",\r\n },\r\n error: {\r\n variant: \"error\",\r\n icon: <XCircle className={cn(iconSize, \"drop-shadow-[var(--drop-glow-error)]\")} />,\r\n label: \"Error\",\r\n extraClass: \"ring-error/30 shadow-neon-glow-error-sm\",\r\n },\r\n waiting: {\r\n variant: \"warning\",\r\n icon: <Clock className={cn(iconSize, \"drop-shadow-[var(--drop-glow-warning)]\")} />,\r\n label: \"Waiting\",\r\n extraClass: \"ring-warning/30 shadow-neon-glow-warning-sm\",\r\n },\r\n waiting_breakpoint: {\r\n variant: \"warning\",\r\n icon: <Hand className={cn(iconSize, \"animate-pulse drop-shadow-[var(--drop-glow-warning)]\")} />,\r\n label: \"Approval Needed\",\r\n extraClass: \"ring-warning/40 animate-breakpoint-glow\",\r\n },\r\n waiting_task: {\r\n variant: \"info\",\r\n icon: <Loader2 className={cn(iconSize, \"animate-spin drop-shadow-[var(--drop-glow-cyan)]\")} />,\r\n label: \"Working\",\r\n extraClass: \"ring-info/30 shadow-neon-glow-cyan-sm\",\r\n },\r\n breakpoint_awaiting: {\r\n variant: \"warning\",\r\n icon: <Hand className={cn(iconSize, \"animate-pulse drop-shadow-[var(--drop-glow-warning)]\")} />,\r\n label: \"Needs Approval\",\r\n extraClass: \"ring-warning/40 animate-breakpoint-glow\",\r\n },\r\n requested: {\r\n variant: \"info\",\r\n icon: <Loader2 className={cn(iconSize, \"animate-spin drop-shadow-[var(--drop-glow-cyan)]\")} />,\r\n label: \"Running\",\r\n extraClass: \"ring-info/30 shadow-neon-glow-cyan-sm\",\r\n },\r\n pending: {\r\n variant: \"pending\",\r\n icon: <Circle className={iconSize} />,\r\n label: \"Pending\",\r\n },\r\n};\r\n\r\ninterface StatusBadgeProps {\r\n status: RunStatus | TaskStatus | string;\r\n className?: string;\r\n waitingKind?: 'breakpoint' | 'task';\r\n isStale?: boolean;\r\n}\r\n\r\nexport function StatusBadge({ status, className, waitingKind, isStale }: StatusBadgeProps) {\r\n // Resolve config: if status is \"waiting\" and a waitingKind is provided, use the sub-variant\r\n let config = statusConfig[status] || statusConfig.pending;\r\n if (status === \"waiting\" && waitingKind) {\r\n const subKey = `waiting_${waitingKind}`;\r\n config = statusConfig[subKey] || config;\r\n }\r\n\r\n // Detect orphaned/interrupted runs: stale with no pending work remaining\r\n const isInterrupted = isStale && (status === \"pending\" || (status === \"waiting\" && !waitingKind));\r\n\r\n return (\r\n <Badge\r\n data-testid={`status-badge-${status}`}\r\n variant={isStale ? \"default\" : config.variant}\r\n className={cn(\r\n \"gap-1\",\r\n isStale\r\n ? \"opacity-60 text-zinc-500 ring-zinc-500/20 bg-zinc-500/10 shadow-none\"\r\n : config.extraClass,\r\n className\r\n )}\r\n >\r\n {config.icon}\r\n {isInterrupted ? \"Interrupted\" : config.label}\r\n </Badge>\r\n );\r\n}\r\n","import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const sideAxis = getSideAxis(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const alignLength = getAxisLength(alignmentAxis);\n const side = getSide(placement);\n const isVertical = sideAxis === 'y';\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n let coords;\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n switch (getAlignment(placement)) {\n case 'start':\n coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n case 'end':\n coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n return coords;\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n var _await$platform$isEle;\n if (options === void 0) {\n options = {};\n }\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = state;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = evaluate(options, state);\n const paddingObject = getPaddingObject(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const rect = elementContext === 'floating' ? {\n x,\n y,\n width: rects.floating.width,\n height: rects.floating.height\n } : rects.reference;\n const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n x: 1,\n y: 1\n } : {\n x: 1,\n y: 1\n };\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n elements,\n rect,\n offsetParent,\n strategy\n }) : rect);\n return {\n top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n };\n}\n\n// Maximum number of resets that can occur before bailing to avoid infinite reset loops.\nconst MAX_RESET_COUNT = 50;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const platformWithDetectOverflow = platform.detectOverflow ? platform : {\n ...platform,\n detectOverflow\n };\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let resetCount = 0;\n const middlewareData = {};\n for (let i = 0; i < middleware.length; i++) {\n const currentMiddleware = middleware[i];\n if (!currentMiddleware) {\n continue;\n }\n const {\n name,\n fn\n } = currentMiddleware;\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform: platformWithDetectOverflow,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData[name] = {\n ...middlewareData[name],\n ...data\n };\n if (reset && resetCount < MAX_RESET_COUNT) {\n resetCount++;\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n i = -1;\n }\n }\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n platform,\n elements,\n middlewareData\n } = state;\n // Since `element` is required, we don't Partial<> the type.\n const {\n element,\n padding = 0\n } = evaluate(options, state) || {};\n if (element == null) {\n return {};\n }\n const paddingObject = getPaddingObject(padding);\n const coords = {\n x,\n y\n };\n const axis = getAlignmentAxis(placement);\n const length = getAxisLength(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const isYAxis = axis === 'y';\n const minProp = isYAxis ? 'top' : 'left';\n const maxProp = isYAxis ? 'bottom' : 'right';\n const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n // DOM platform can return `window` as the `offsetParent`.\n if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n clientSize = elements.floating[clientProp] || rects.floating[length];\n }\n const centerToReference = endDiff / 2 - startDiff / 2;\n\n // If the padding is large enough that it causes the arrow to no longer be\n // centered, modify the padding so that it is centered.\n const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside the floating element's bounds.\n const min$1 = minPadding;\n const max = clientSize - arrowDimensions[length] - maxPadding;\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = clamp(min$1, center, max);\n\n // If the reference is small enough that the arrow's padding causes it to\n // to point to nothing for an aligned placement, adjust the offset of the\n // floating element itself. To ensure `shift()` continues to take action,\n // a single reset is performed when this is true.\n const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n return {\n [axis]: coords[axis] + alignmentOffset,\n data: {\n [axis]: offset,\n centerOffset: center - offset - alignmentOffset,\n ...(shouldAddOffset && {\n alignmentOffset\n })\n },\n reset: shouldAddOffset\n };\n }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n return true;\n });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'autoPlacement',\n options,\n async fn(state) {\n var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n const {\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = state;\n const {\n crossAxis = false,\n alignment,\n allowedPlacements = placements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n const currentPlacement = placements$1[currentIndex];\n if (currentPlacement == null) {\n return {};\n }\n const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n // Make `computeCoords` start from the right place.\n if (placement !== currentPlacement) {\n return {\n reset: {\n placement: placements$1[0]\n }\n };\n }\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements$1[currentIndex + 1];\n\n // There are more placements to check.\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n const placementsSortedByMostSpace = allOverflows.map(d => {\n const alignment = getAlignment(d.placement);\n return [d.placement, alignment && crossAxis ?\n // Check along the mainAxis and main crossAxis side.\n d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n // Check only the mainAxis.\n d.overflows[0], d.overflows];\n }).sort((a, b) => a[1] - b[1]);\n const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n // Aligned placements should not check their opposite crossAxis\n // side.\n getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n return {};\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'flip',\n options,\n async fn(state) {\n var _middlewareData$arrow, _middlewareData$flip;\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n fallbackAxisSideDirection = 'none',\n flipAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n\n // If a reset by the arrow was caused due to an alignment offset being\n // added, we should skip any logic now since `flip()` has already done its\n // work.\n // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n const side = getSide(placement);\n const initialSideAxis = getSideAxis(initialPlacement);\n const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n }\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n if (checkCrossAxis) {\n const sides = getAlignmentSides(placement, rects, rtl);\n overflows.push(overflow[sides[0]], overflow[sides[1]]);\n }\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }];\n\n // One or more sides is overflowing.\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip2, _overflowsData$filter;\n const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n const nextPlacement = placements[nextIndex];\n if (nextPlacement) {\n const ignoreCrossAxisOverflow = checkCrossAxis === 'alignment' ? initialSideAxis !== getSideAxis(nextPlacement) : false;\n if (!ignoreCrossAxisOverflow ||\n // We leave the current main axis only if every placement on that axis\n // overflows the main axis.\n overflowsData.every(d => getSideAxis(d.placement) === initialSideAxis ? d.overflows[0] > 0 : true)) {\n // Try next placement and re-run the lifecycle.\n return {\n data: {\n index: nextIndex,\n overflows: overflowsData\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n }\n\n // First, find the candidates that fit on the mainAxis side of overflow,\n // then find the placement that fits the best on the main crossAxis side.\n let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n // Otherwise fallback.\n if (!resetPlacement) {\n switch (fallbackStrategy) {\n case 'bestFit':\n {\n var _overflowsData$filter2;\n const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n if (hasFallbackAxisSideDirection) {\n const currentSideAxis = getSideAxis(d.placement);\n return currentSideAxis === initialSideAxis ||\n // Create a bias to the `y` side axis due to horizontal\n // reading directions favoring greater width.\n currentSideAxis === 'y';\n }\n return true;\n }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n if (placement) {\n resetPlacement = placement;\n }\n break;\n }\n case 'initialPlacement':\n resetPlacement = initialPlacement;\n break;\n }\n }\n if (placement !== resetPlacement) {\n return {\n reset: {\n placement: resetPlacement\n }\n };\n }\n }\n return {};\n }\n };\n};\n\nfunction getSideOffsets(overflow, rect) {\n return {\n top: overflow.top - rect.height,\n right: overflow.right - rect.width,\n bottom: overflow.bottom - rect.height,\n left: overflow.left - rect.width\n };\n}\nfunction isAnySideFullyClipped(overflow) {\n return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'hide',\n options,\n async fn(state) {\n const {\n rects,\n platform\n } = state;\n const {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = evaluate(options, state);\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await platform.detectOverflow(state, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n case 'escaped':\n {\n const overflow = await platform.detectOverflow(state, {\n ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n default:\n {\n return {};\n }\n }\n }\n };\n};\n\nfunction getBoundingRect(rects) {\n const minX = min(...rects.map(rect => rect.left));\n const minY = min(...rects.map(rect => rect.top));\n const maxX = max(...rects.map(rect => rect.right));\n const maxY = max(...rects.map(rect => rect.bottom));\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\nfunction getRectsByLine(rects) {\n const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n const groups = [];\n let prevRect = null;\n for (let i = 0; i < sortedRects.length; i++) {\n const rect = sortedRects[i];\n if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n groups.push([rect]);\n } else {\n groups[groups.length - 1].push(rect);\n }\n prevRect = rect;\n }\n return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'inline',\n options,\n async fn(state) {\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = state;\n // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n const {\n padding = 2,\n x,\n y\n } = evaluate(options, state);\n const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n const clientRects = getRectsByLine(nativeClientRects);\n const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n const paddingObject = getPaddingObject(padding);\n function getBoundingClientRect() {\n // There are two rects and they are disjoined.\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n // Find the first rect in which the point is fully inside.\n return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n }\n\n // There are 2 or more connected rects.\n if (clientRects.length >= 2) {\n if (getSideAxis(placement) === 'y') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n return fallback;\n }\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n return {};\n }\n };\n};\n\nconst originSides = /*#__PURE__*/new Set(['left', 'top']);\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n const {\n placement,\n platform,\n elements\n } = state;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isVertical = getSideAxis(placement) === 'y';\n const mainAxisMulti = originSides.has(side) ? -1 : 1;\n const crossAxisMulti = rtl && isVertical ? -1 : 1;\n const rawValue = evaluate(options, state);\n\n // eslint-disable-next-line prefer-const\n let {\n mainAxis,\n crossAxis,\n alignmentAxis\n } = typeof rawValue === 'number' ? {\n mainAxis: rawValue,\n crossAxis: 0,\n alignmentAxis: null\n } : {\n mainAxis: rawValue.mainAxis || 0,\n crossAxis: rawValue.crossAxis || 0,\n alignmentAxis: rawValue.alignmentAxis\n };\n if (alignment && typeof alignmentAxis === 'number') {\n crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n }\n return isVertical ? {\n x: crossAxis * crossAxisMulti,\n y: mainAxis * mainAxisMulti\n } : {\n x: mainAxis * mainAxisMulti,\n y: crossAxis * crossAxisMulti\n };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n if (options === void 0) {\n options = 0;\n }\n return {\n name: 'offset',\n options,\n async fn(state) {\n var _middlewareData$offse, _middlewareData$arrow;\n const {\n x,\n y,\n placement,\n middlewareData\n } = state;\n const diffCoords = await convertValueToCoords(state, options);\n\n // If the placement is the same and the arrow caused an alignment offset\n // then we don't need to change the positioning coordinates.\n if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n return {\n x: x + diffCoords.x,\n y: y + diffCoords.y,\n data: {\n ...diffCoords,\n placement\n }\n };\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'shift',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n platform\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n const crossAxis = getSideAxis(getSide(placement));\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = clamp(min, mainAxisCoord, max);\n }\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = clamp(min, crossAxisCoord, max);\n }\n const limitedCoords = limiter.fn({\n ...state,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return {\n ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y,\n enabled: {\n [mainAxis]: checkMainAxis,\n [crossAxis]: checkCrossAxis\n }\n }\n };\n }\n };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n options,\n fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = state;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const crossAxis = getSideAxis(placement);\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = evaluate(offset, state);\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2;\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = originSides.has(getSide(placement));\n const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n if (crossAxisCoord < limitMin) {\n crossAxisCoord = limitMin;\n } else if (crossAxisCoord > limitMax) {\n crossAxisCoord = limitMax;\n }\n }\n return {\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n };\n }\n };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'size',\n options,\n async fn(state) {\n var _state$middlewareData, _state$middlewareData2;\n const {\n placement,\n rects,\n platform,\n elements\n } = state;\n const {\n apply = () => {},\n ...detectOverflowOptions\n } = evaluate(options, state);\n const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isYAxis = getSideAxis(placement) === 'y';\n const {\n width,\n height\n } = rects.floating;\n let heightSide;\n let widthSide;\n if (side === 'top' || side === 'bottom') {\n heightSide = side;\n widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n } else {\n widthSide = side;\n heightSide = alignment === 'end' ? 'top' : 'bottom';\n }\n const maximumClippingHeight = height - overflow.top - overflow.bottom;\n const maximumClippingWidth = width - overflow.left - overflow.right;\n const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n const noShift = !state.middlewareData.shift;\n let availableHeight = overflowAvailableHeight;\n let availableWidth = overflowAvailableWidth;\n if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {\n availableWidth = maximumClippingWidth;\n }\n if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {\n availableHeight = maximumClippingHeight;\n }\n if (noShift && !alignment) {\n const xMin = max(overflow.left, 0);\n const xMax = max(overflow.right, 0);\n const yMin = max(overflow.top, 0);\n const yMax = max(overflow.bottom, 0);\n if (isYAxis) {\n availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n } else {\n availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n }\n }\n await apply({\n ...state,\n availableWidth,\n availableHeight\n });\n const nextDimensions = await platform.getDimensions(elements.floating);\n if (width !== nextDimensions.width || height !== nextDimensions.height) {\n return {\n reset: {\n rects: true\n }\n };\n }\n return {};\n }\n };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n","// packages/react/use-size/src/use-size.tsx\nimport * as React from \"react\";\nimport { useLayoutEffect } from \"@radix-ui/react-use-layout-effect\";\nfunction useSize(element) {\n const [size, setSize] = React.useState(void 0);\n useLayoutEffect(() => {\n if (element) {\n setSize({ width: element.offsetWidth, height: element.offsetHeight });\n const resizeObserver = new ResizeObserver((entries) => {\n if (!Array.isArray(entries)) {\n return;\n }\n if (!entries.length) {\n return;\n }\n const entry = entries[0];\n let width;\n let height;\n if (\"borderBoxSize\" in entry) {\n const borderSizeEntry = entry[\"borderBoxSize\"];\n const borderSize = Array.isArray(borderSizeEntry) ? borderSizeEntry[0] : borderSizeEntry;\n width = borderSize[\"inlineSize\"];\n height = borderSize[\"blockSize\"];\n } else {\n width = element.offsetWidth;\n height = element.offsetHeight;\n }\n setSize({ width, height });\n });\n resizeObserver.observe(element, { box: \"border-box\" });\n return () => resizeObserver.unobserve(element);\n } else {\n setSize(void 0);\n }\n }, [element]);\n return size;\n}\nexport {\n useSize\n};\n//# sourceMappingURL=index.mjs.map\n","import * as React from 'react';\nimport {\n useFloating,\n autoUpdate,\n offset,\n shift,\n limitShift,\n hide,\n arrow as floatingUIarrow,\n flip,\n size,\n} from '@floating-ui/react-dom';\nimport * as ArrowPrimitive from '@radix-ui/react-arrow';\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport { createContextScope } from '@radix-ui/react-context';\nimport { Primitive } from '@radix-ui/react-primitive';\nimport { useCallbackRef } from '@radix-ui/react-use-callback-ref';\nimport { useLayoutEffect } from '@radix-ui/react-use-layout-effect';\nimport { useSize } from '@radix-ui/react-use-size';\n\nimport type { Placement, Middleware } from '@floating-ui/react-dom';\nimport type { Scope } from '@radix-ui/react-context';\nimport type { Measurable } from '@radix-ui/rect';\n\nconst SIDE_OPTIONS = ['top', 'right', 'bottom', 'left'] as const;\nconst ALIGN_OPTIONS = ['start', 'center', 'end'] as const;\n\ntype Side = (typeof SIDE_OPTIONS)[number];\ntype Align = (typeof ALIGN_OPTIONS)[number];\n\n/* -------------------------------------------------------------------------------------------------\n * Popper\n * -----------------------------------------------------------------------------------------------*/\n\nconst POPPER_NAME = 'Popper';\n\ntype ScopedProps<P> = P & { __scopePopper?: Scope };\nconst [createPopperContext, createPopperScope] = createContextScope(POPPER_NAME);\n\ntype PopperContextValue = {\n anchor: Measurable | null;\n onAnchorChange(anchor: Measurable | null): void;\n};\nconst [PopperProvider, usePopperContext] = createPopperContext<PopperContextValue>(POPPER_NAME);\n\ninterface PopperProps {\n children?: React.ReactNode;\n}\nconst Popper: React.FC<PopperProps> = (props: ScopedProps<PopperProps>) => {\n const { __scopePopper, children } = props;\n const [anchor, setAnchor] = React.useState<Measurable | null>(null);\n return (\n <PopperProvider scope={__scopePopper} anchor={anchor} onAnchorChange={setAnchor}>\n {children}\n </PopperProvider>\n );\n};\n\nPopper.displayName = POPPER_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * PopperAnchor\n * -----------------------------------------------------------------------------------------------*/\n\nconst ANCHOR_NAME = 'PopperAnchor';\n\ntype PopperAnchorElement = React.ComponentRef<typeof Primitive.div>;\ntype PrimitiveDivProps = React.ComponentPropsWithoutRef<typeof Primitive.div>;\ninterface PopperAnchorProps extends PrimitiveDivProps {\n virtualRef?: React.RefObject<Measurable>;\n}\n\nconst PopperAnchor = React.forwardRef<PopperAnchorElement, PopperAnchorProps>(\n (props: ScopedProps<PopperAnchorProps>, forwardedRef) => {\n const { __scopePopper, virtualRef, ...anchorProps } = props;\n const context = usePopperContext(ANCHOR_NAME, __scopePopper);\n const ref = React.useRef<PopperAnchorElement>(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n\n const anchorRef = React.useRef<Measurable | null>(null);\n React.useEffect(() => {\n const previousAnchor = anchorRef.current;\n anchorRef.current = virtualRef?.current || ref.current;\n if (previousAnchor !== anchorRef.current) {\n // Consumer can anchor the popper to something that isn't\n // a DOM node e.g. pointer position, so we override the\n // `anchorRef` with their virtual ref in this case.\n context.onAnchorChange(anchorRef.current);\n }\n });\n\n return virtualRef ? null : <Primitive.div {...anchorProps} ref={composedRefs} />;\n }\n);\n\nPopperAnchor.displayName = ANCHOR_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * PopperContent\n * -----------------------------------------------------------------------------------------------*/\n\nconst CONTENT_NAME = 'PopperContent';\n\ntype PopperContentContextValue = {\n placedSide: Side;\n onArrowChange(arrow: HTMLSpanElement | null): void;\n arrowX?: number;\n arrowY?: number;\n shouldHideArrow: boolean;\n};\n\nconst [PopperContentProvider, useContentContext] =\n createPopperContext<PopperContentContextValue>(CONTENT_NAME);\n\ntype Boundary = Element | null;\n\ntype PopperContentElement = React.ComponentRef<typeof Primitive.div>;\ninterface PopperContentProps extends PrimitiveDivProps {\n side?: Side;\n sideOffset?: number;\n align?: Align;\n alignOffset?: number;\n arrowPadding?: number;\n avoidCollisions?: boolean;\n collisionBoundary?: Boundary | Boundary[];\n collisionPadding?: number | Partial<Record<Side, number>>;\n sticky?: 'partial' | 'always';\n hideWhenDetached?: boolean;\n updatePositionStrategy?: 'optimized' | 'always';\n onPlaced?: () => void;\n}\n\nconst PopperContent = React.forwardRef<PopperContentElement, PopperContentProps>(\n (props: ScopedProps<PopperContentProps>, forwardedRef) => {\n const {\n __scopePopper,\n side = 'bottom',\n sideOffset = 0,\n align = 'center',\n alignOffset = 0,\n arrowPadding = 0,\n avoidCollisions = true,\n collisionBoundary = [],\n collisionPadding: collisionPaddingProp = 0,\n sticky = 'partial',\n hideWhenDetached = false,\n updatePositionStrategy = 'optimized',\n onPlaced,\n ...contentProps\n } = props;\n\n const context = usePopperContext(CONTENT_NAME, __scopePopper);\n\n const [content, setContent] = React.useState<HTMLDivElement | null>(null);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setContent(node));\n\n const [arrow, setArrow] = React.useState<HTMLSpanElement | null>(null);\n const arrowSize = useSize(arrow);\n const arrowWidth = arrowSize?.width ?? 0;\n const arrowHeight = arrowSize?.height ?? 0;\n\n const desiredPlacement = (side + (align !== 'center' ? '-' + align : '')) as Placement;\n\n const collisionPadding =\n typeof collisionPaddingProp === 'number'\n ? collisionPaddingProp\n : { top: 0, right: 0, bottom: 0, left: 0, ...collisionPaddingProp };\n\n const boundary = Array.isArray(collisionBoundary) ? collisionBoundary : [collisionBoundary];\n const hasExplicitBoundaries = boundary.length > 0;\n\n const detectOverflowOptions = {\n padding: collisionPadding,\n boundary: boundary.filter(isNotNull),\n // with `strategy: 'fixed'`, this is the only way to get it to respect boundaries\n altBoundary: hasExplicitBoundaries,\n };\n\n const { refs, floatingStyles, placement, isPositioned, middlewareData } = useFloating({\n // default to `fixed` strategy so users don't have to pick and we also avoid focus scroll issues\n strategy: 'fixed',\n placement: desiredPlacement,\n whileElementsMounted: (...args) => {\n const cleanup = autoUpdate(...args, {\n animationFrame: updatePositionStrategy === 'always',\n });\n return cleanup;\n },\n elements: {\n reference: context.anchor,\n },\n middleware: [\n offset({ mainAxis: sideOffset + arrowHeight, alignmentAxis: alignOffset }),\n avoidCollisions &&\n shift({\n mainAxis: true,\n crossAxis: false,\n limiter: sticky === 'partial' ? limitShift() : undefined,\n ...detectOverflowOptions,\n }),\n avoidCollisions && flip({ ...detectOverflowOptions }),\n size({\n ...detectOverflowOptions,\n apply: ({ elements, rects, availableWidth, availableHeight }) => {\n const { width: anchorWidth, height: anchorHeight } = rects.reference;\n const contentStyle = elements.floating.style;\n contentStyle.setProperty('--radix-popper-available-width', `${availableWidth}px`);\n contentStyle.setProperty('--radix-popper-available-height', `${availableHeight}px`);\n contentStyle.setProperty('--radix-popper-anchor-width', `${anchorWidth}px`);\n contentStyle.setProperty('--radix-popper-anchor-height', `${anchorHeight}px`);\n },\n }),\n arrow && floatingUIarrow({ element: arrow, padding: arrowPadding }),\n transformOrigin({ arrowWidth, arrowHeight }),\n hideWhenDetached && hide({ strategy: 'referenceHidden', ...detectOverflowOptions }),\n ],\n });\n\n const [placedSide, placedAlign] = getSideAndAlignFromPlacement(placement);\n\n const handlePlaced = useCallbackRef(onPlaced);\n useLayoutEffect(() => {\n if (isPositioned) {\n handlePlaced?.();\n }\n }, [isPositioned, handlePlaced]);\n\n const arrowX = middlewareData.arrow?.x;\n const arrowY = middlewareData.arrow?.y;\n const cannotCenterArrow = middlewareData.arrow?.centerOffset !== 0;\n\n const [contentZIndex, setContentZIndex] = React.useState<string>();\n useLayoutEffect(() => {\n if (content) setContentZIndex(window.getComputedStyle(content).zIndex);\n }, [content]);\n\n return (\n <div\n ref={refs.setFloating}\n data-radix-popper-content-wrapper=\"\"\n style={{\n ...floatingStyles,\n transform: isPositioned ? floatingStyles.transform : 'translate(0, -200%)', // keep off the page when measuring\n minWidth: 'max-content',\n zIndex: contentZIndex,\n ['--radix-popper-transform-origin' as any]: [\n middlewareData.transformOrigin?.x,\n middlewareData.transformOrigin?.y,\n ].join(' '),\n\n // hide the content if using the hide middleware and should be hidden\n // set visibility to hidden and disable pointer events so the UI behaves\n // as if the PopperContent isn't there at all\n ...(middlewareData.hide?.referenceHidden && {\n visibility: 'hidden',\n pointerEvents: 'none',\n }),\n }}\n // Floating UI interally calculates logical alignment based the `dir` attribute on\n // the reference/floating node, we must add this attribute here to ensure\n // this is calculated when portalled as well as inline.\n dir={props.dir}\n >\n <PopperContentProvider\n scope={__scopePopper}\n placedSide={placedSide}\n onArrowChange={setArrow}\n arrowX={arrowX}\n arrowY={arrowY}\n shouldHideArrow={cannotCenterArrow}\n >\n <Primitive.div\n data-side={placedSide}\n data-align={placedAlign}\n {...contentProps}\n ref={composedRefs}\n style={{\n ...contentProps.style,\n // if the PopperContent hasn't been placed yet (not all measurements done)\n // we prevent animations so that users's animation don't kick in too early referring wrong sides\n animation: !isPositioned ? 'none' : undefined,\n }}\n />\n </PopperContentProvider>\n </div>\n );\n }\n);\n\nPopperContent.displayName = CONTENT_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * PopperArrow\n * -----------------------------------------------------------------------------------------------*/\n\nconst ARROW_NAME = 'PopperArrow';\n\nconst OPPOSITE_SIDE: Record<Side, Side> = {\n top: 'bottom',\n right: 'left',\n bottom: 'top',\n left: 'right',\n};\n\ntype PopperArrowElement = React.ComponentRef<typeof ArrowPrimitive.Root>;\ntype ArrowProps = React.ComponentPropsWithoutRef<typeof ArrowPrimitive.Root>;\ninterface PopperArrowProps extends ArrowProps {}\n\nconst PopperArrow = React.forwardRef<PopperArrowElement, PopperArrowProps>(function PopperArrow(\n props: ScopedProps<PopperArrowProps>,\n forwardedRef\n) {\n const { __scopePopper, ...arrowProps } = props;\n const contentContext = useContentContext(ARROW_NAME, __scopePopper);\n const baseSide = OPPOSITE_SIDE[contentContext.placedSide];\n\n return (\n // we have to use an extra wrapper because `ResizeObserver` (used by `useSize`)\n // doesn't report size as we'd expect on SVG elements.\n // it reports their bounding box which is effectively the largest path inside the SVG.\n <span\n ref={contentContext.onArrowChange}\n style={{\n position: 'absolute',\n left: contentContext.arrowX,\n top: contentContext.arrowY,\n [baseSide]: 0,\n transformOrigin: {\n top: '',\n right: '0 0',\n bottom: 'center 0',\n left: '100% 0',\n }[contentContext.placedSide],\n transform: {\n top: 'translateY(100%)',\n right: 'translateY(50%) rotate(90deg) translateX(-50%)',\n bottom: `rotate(180deg)`,\n left: 'translateY(50%) rotate(-90deg) translateX(50%)',\n }[contentContext.placedSide],\n visibility: contentContext.shouldHideArrow ? 'hidden' : undefined,\n }}\n >\n <ArrowPrimitive.Root\n {...arrowProps}\n ref={forwardedRef}\n style={{\n ...arrowProps.style,\n // ensures the element can be measured correctly (mostly for if SVG)\n display: 'block',\n }}\n />\n </span>\n );\n});\n\nPopperArrow.displayName = ARROW_NAME;\n\n/* -----------------------------------------------------------------------------------------------*/\n\nfunction isNotNull<T>(value: T | null): value is T {\n return value !== null;\n}\n\nconst transformOrigin = (options: { arrowWidth: number; arrowHeight: number }): Middleware => ({\n name: 'transformOrigin',\n options,\n fn(data) {\n const { placement, rects, middlewareData } = data;\n\n const cannotCenterArrow = middlewareData.arrow?.centerOffset !== 0;\n const isArrowHidden = cannotCenterArrow;\n const arrowWidth = isArrowHidden ? 0 : options.arrowWidth;\n const arrowHeight = isArrowHidden ? 0 : options.arrowHeight;\n\n const [placedSide, placedAlign] = getSideAndAlignFromPlacement(placement);\n const noArrowAlign = { start: '0%', center: '50%', end: '100%' }[placedAlign];\n\n const arrowXCenter = (middlewareData.arrow?.x ?? 0) + arrowWidth / 2;\n const arrowYCenter = (middlewareData.arrow?.y ?? 0) + arrowHeight / 2;\n\n let x = '';\n let y = '';\n\n if (placedSide === 'bottom') {\n x = isArrowHidden ? noArrowAlign : `${arrowXCenter}px`;\n y = `${-arrowHeight}px`;\n } else if (placedSide === 'top') {\n x = isArrowHidden ? noArrowAlign : `${arrowXCenter}px`;\n y = `${rects.floating.height + arrowHeight}px`;\n } else if (placedSide === 'right') {\n x = `${-arrowHeight}px`;\n y = isArrowHidden ? noArrowAlign : `${arrowYCenter}px`;\n } else if (placedSide === 'left') {\n x = `${rects.floating.width + arrowHeight}px`;\n y = isArrowHidden ? noArrowAlign : `${arrowYCenter}px`;\n }\n return { data: { x, y } };\n },\n});\n\nfunction getSideAndAlignFromPlacement(placement: Placement) {\n const [side, align = 'center'] = placement.split('-');\n return [side as Side, align as Align] as const;\n}\n\nconst Root = Popper;\nconst Anchor = PopperAnchor;\nconst Content = PopperContent;\nconst Arrow = PopperArrow;\n\nexport {\n createPopperScope,\n //\n Popper,\n PopperAnchor,\n PopperContent,\n PopperArrow,\n //\n Root,\n Anchor,\n Content,\n Arrow,\n //\n SIDE_OPTIONS,\n ALIGN_OPTIONS,\n};\nexport type { PopperProps, PopperAnchorProps, PopperContentProps, PopperArrowProps };\n","import * as React from 'react';\nimport { composeEventHandlers } from '@radix-ui/primitive';\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport { createContextScope } from '@radix-ui/react-context';\nimport { DismissableLayer } from '@radix-ui/react-dismissable-layer';\nimport { useId } from '@radix-ui/react-id';\nimport * as PopperPrimitive from '@radix-ui/react-popper';\nimport { createPopperScope } from '@radix-ui/react-popper';\nimport { Portal as PortalPrimitive } from '@radix-ui/react-portal';\nimport { Presence } from '@radix-ui/react-presence';\nimport { Primitive } from '@radix-ui/react-primitive';\nimport { createSlottable } from '@radix-ui/react-slot';\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport * as VisuallyHiddenPrimitive from '@radix-ui/react-visually-hidden';\n\nimport type { Scope } from '@radix-ui/react-context';\n\ntype ScopedProps<P = {}> = P & { __scopeTooltip?: Scope };\nconst [createTooltipContext, createTooltipScope] = createContextScope('Tooltip', [\n createPopperScope,\n]);\nconst usePopperScope = createPopperScope();\n\n/* -------------------------------------------------------------------------------------------------\n * TooltipProvider\n * -----------------------------------------------------------------------------------------------*/\n\nconst PROVIDER_NAME = 'TooltipProvider';\nconst DEFAULT_DELAY_DURATION = 700;\nconst TOOLTIP_OPEN = 'tooltip.open';\n\ntype TooltipProviderContextValue = {\n isOpenDelayedRef: React.MutableRefObject<boolean>;\n delayDuration: number;\n onOpen(): void;\n onClose(): void;\n onPointerInTransitChange(inTransit: boolean): void;\n isPointerInTransitRef: React.MutableRefObject<boolean>;\n disableHoverableContent: boolean;\n};\n\nconst [TooltipProviderContextProvider, useTooltipProviderContext] =\n createTooltipContext<TooltipProviderContextValue>(PROVIDER_NAME);\n\ninterface TooltipProviderProps {\n children: React.ReactNode;\n /**\n * The duration from when the pointer enters the trigger until the tooltip gets opened.\n * @defaultValue 700\n */\n delayDuration?: number;\n /**\n * How much time a user has to enter another trigger without incurring a delay again.\n * @defaultValue 300\n */\n skipDelayDuration?: number;\n /**\n * When `true`, trying to hover the content will result in the tooltip closing as the pointer leaves the trigger.\n * @defaultValue false\n */\n disableHoverableContent?: boolean;\n}\n\nconst TooltipProvider: React.FC<TooltipProviderProps> = (\n props: ScopedProps<TooltipProviderProps>\n) => {\n const {\n __scopeTooltip,\n delayDuration = DEFAULT_DELAY_DURATION,\n skipDelayDuration = 300,\n disableHoverableContent = false,\n children,\n } = props;\n const isOpenDelayedRef = React.useRef(true);\n const isPointerInTransitRef = React.useRef(false);\n const skipDelayTimerRef = React.useRef(0);\n\n React.useEffect(() => {\n const skipDelayTimer = skipDelayTimerRef.current;\n return () => window.clearTimeout(skipDelayTimer);\n }, []);\n\n return (\n <TooltipProviderContextProvider\n scope={__scopeTooltip}\n isOpenDelayedRef={isOpenDelayedRef}\n delayDuration={delayDuration}\n onOpen={React.useCallback(() => {\n window.clearTimeout(skipDelayTimerRef.current);\n isOpenDelayedRef.current = false;\n }, [])}\n onClose={React.useCallback(() => {\n window.clearTimeout(skipDelayTimerRef.current);\n skipDelayTimerRef.current = window.setTimeout(\n () => (isOpenDelayedRef.current = true),\n skipDelayDuration\n );\n }, [skipDelayDuration])}\n isPointerInTransitRef={isPointerInTransitRef}\n onPointerInTransitChange={React.useCallback((inTransit: boolean) => {\n isPointerInTransitRef.current = inTransit;\n }, [])}\n disableHoverableContent={disableHoverableContent}\n >\n {children}\n </TooltipProviderContextProvider>\n );\n};\n\nTooltipProvider.displayName = PROVIDER_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * Tooltip\n * -----------------------------------------------------------------------------------------------*/\n\nconst TOOLTIP_NAME = 'Tooltip';\n\ntype TooltipContextValue = {\n contentId: string;\n open: boolean;\n stateAttribute: 'closed' | 'delayed-open' | 'instant-open';\n trigger: TooltipTriggerElement | null;\n onTriggerChange(trigger: TooltipTriggerElement | null): void;\n onTriggerEnter(): void;\n onTriggerLeave(): void;\n onOpen(): void;\n onClose(): void;\n disableHoverableContent: boolean;\n};\n\nconst [TooltipContextProvider, useTooltipContext] =\n createTooltipContext<TooltipContextValue>(TOOLTIP_NAME);\n\ninterface TooltipProps {\n children?: React.ReactNode;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /**\n * The duration from when the pointer enters the trigger until the tooltip gets opened. This will\n * override the prop with the same name passed to Provider.\n * @defaultValue 700\n */\n delayDuration?: number;\n /**\n * When `true`, trying to hover the content will result in the tooltip closing as the pointer leaves the trigger.\n * @defaultValue false\n */\n disableHoverableContent?: boolean;\n}\n\nconst Tooltip: React.FC<TooltipProps> = (props: ScopedProps<TooltipProps>) => {\n const {\n __scopeTooltip,\n children,\n open: openProp,\n defaultOpen,\n onOpenChange,\n disableHoverableContent: disableHoverableContentProp,\n delayDuration: delayDurationProp,\n } = props;\n const providerContext = useTooltipProviderContext(TOOLTIP_NAME, props.__scopeTooltip);\n const popperScope = usePopperScope(__scopeTooltip);\n const [trigger, setTrigger] = React.useState<HTMLButtonElement | null>(null);\n const contentId = useId();\n const openTimerRef = React.useRef(0);\n const disableHoverableContent =\n disableHoverableContentProp ?? providerContext.disableHoverableContent;\n const delayDuration = delayDurationProp ?? providerContext.delayDuration;\n const wasOpenDelayedRef = React.useRef(false);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: (open) => {\n if (open) {\n providerContext.onOpen();\n\n // as `onChange` is called within a lifecycle method we\n // avoid dispatching via `dispatchDiscreteCustomEvent`.\n document.dispatchEvent(new CustomEvent(TOOLTIP_OPEN));\n } else {\n providerContext.onClose();\n }\n onOpenChange?.(open);\n },\n caller: TOOLTIP_NAME,\n });\n const stateAttribute = React.useMemo(() => {\n return open ? (wasOpenDelayedRef.current ? 'delayed-open' : 'instant-open') : 'closed';\n }, [open]);\n\n const handleOpen = React.useCallback(() => {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = 0;\n wasOpenDelayedRef.current = false;\n setOpen(true);\n }, [setOpen]);\n\n const handleClose = React.useCallback(() => {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = 0;\n setOpen(false);\n }, [setOpen]);\n\n const handleDelayedOpen = React.useCallback(() => {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = window.setTimeout(() => {\n wasOpenDelayedRef.current = true;\n setOpen(true);\n openTimerRef.current = 0;\n }, delayDuration);\n }, [delayDuration, setOpen]);\n\n React.useEffect(() => {\n return () => {\n if (openTimerRef.current) {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = 0;\n }\n };\n }, []);\n\n return (\n <PopperPrimitive.Root {...popperScope}>\n <TooltipContextProvider\n scope={__scopeTooltip}\n contentId={contentId}\n open={open}\n stateAttribute={stateAttribute}\n trigger={trigger}\n onTriggerChange={setTrigger}\n onTriggerEnter={React.useCallback(() => {\n if (providerContext.isOpenDelayedRef.current) handleDelayedOpen();\n else handleOpen();\n }, [providerContext.isOpenDelayedRef, handleDelayedOpen, handleOpen])}\n onTriggerLeave={React.useCallback(() => {\n if (disableHoverableContent) {\n handleClose();\n } else {\n // Clear the timer in case the pointer leaves the trigger before the tooltip is opened.\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = 0;\n }\n }, [handleClose, disableHoverableContent])}\n onOpen={handleOpen}\n onClose={handleClose}\n disableHoverableContent={disableHoverableContent}\n >\n {children}\n </TooltipContextProvider>\n </PopperPrimitive.Root>\n );\n};\n\nTooltip.displayName = TOOLTIP_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * TooltipTrigger\n * -----------------------------------------------------------------------------------------------*/\n\nconst TRIGGER_NAME = 'TooltipTrigger';\n\ntype TooltipTriggerElement = React.ComponentRef<typeof Primitive.button>;\ntype PrimitiveButtonProps = React.ComponentPropsWithoutRef<typeof Primitive.button>;\ninterface TooltipTriggerProps extends PrimitiveButtonProps {}\n\nconst TooltipTrigger = React.forwardRef<TooltipTriggerElement, TooltipTriggerProps>(\n (props: ScopedProps<TooltipTriggerProps>, forwardedRef) => {\n const { __scopeTooltip, ...triggerProps } = props;\n const context = useTooltipContext(TRIGGER_NAME, __scopeTooltip);\n const providerContext = useTooltipProviderContext(TRIGGER_NAME, __scopeTooltip);\n const popperScope = usePopperScope(__scopeTooltip);\n const ref = React.useRef<TooltipTriggerElement>(null);\n const composedRefs = useComposedRefs(forwardedRef, ref, context.onTriggerChange);\n const isPointerDownRef = React.useRef(false);\n const hasPointerMoveOpenedRef = React.useRef(false);\n const handlePointerUp = React.useCallback(() => (isPointerDownRef.current = false), []);\n\n React.useEffect(() => {\n return () => document.removeEventListener('pointerup', handlePointerUp);\n }, [handlePointerUp]);\n\n return (\n <PopperPrimitive.Anchor asChild {...popperScope}>\n <Primitive.button\n // We purposefully avoid adding `type=button` here because tooltip triggers are also\n // commonly anchors and the anchor `type` attribute signifies MIME type.\n aria-describedby={context.open ? context.contentId : undefined}\n data-state={context.stateAttribute}\n {...triggerProps}\n ref={composedRefs}\n onPointerMove={composeEventHandlers(props.onPointerMove, (event) => {\n if (event.pointerType === 'touch') return;\n if (\n !hasPointerMoveOpenedRef.current &&\n !providerContext.isPointerInTransitRef.current\n ) {\n context.onTriggerEnter();\n hasPointerMoveOpenedRef.current = true;\n }\n })}\n onPointerLeave={composeEventHandlers(props.onPointerLeave, () => {\n context.onTriggerLeave();\n hasPointerMoveOpenedRef.current = false;\n })}\n onPointerDown={composeEventHandlers(props.onPointerDown, () => {\n if (context.open) {\n context.onClose();\n }\n isPointerDownRef.current = true;\n document.addEventListener('pointerup', handlePointerUp, { once: true });\n })}\n onFocus={composeEventHandlers(props.onFocus, () => {\n if (!isPointerDownRef.current) context.onOpen();\n })}\n onBlur={composeEventHandlers(props.onBlur, context.onClose)}\n onClick={composeEventHandlers(props.onClick, context.onClose)}\n />\n </PopperPrimitive.Anchor>\n );\n }\n);\n\nTooltipTrigger.displayName = TRIGGER_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * TooltipPortal\n * -----------------------------------------------------------------------------------------------*/\n\nconst PORTAL_NAME = 'TooltipPortal';\n\ntype PortalContextValue = { forceMount?: true };\nconst [PortalProvider, usePortalContext] = createTooltipContext<PortalContextValue>(PORTAL_NAME, {\n forceMount: undefined,\n});\n\ntype PortalProps = React.ComponentPropsWithoutRef<typeof PortalPrimitive>;\ninterface TooltipPortalProps {\n children?: React.ReactNode;\n /**\n * Specify a container element to portal the content into.\n */\n container?: PortalProps['container'];\n /**\n * Used to force mounting when more control is needed. Useful when\n * controlling animation with React animation libraries.\n */\n forceMount?: true;\n}\n\nconst TooltipPortal: React.FC<TooltipPortalProps> = (props: ScopedProps<TooltipPortalProps>) => {\n const { __scopeTooltip, forceMount, children, container } = props;\n const context = useTooltipContext(PORTAL_NAME, __scopeTooltip);\n return (\n <PortalProvider scope={__scopeTooltip} forceMount={forceMount}>\n <Presence present={forceMount || context.open}>\n <PortalPrimitive asChild container={container}>\n {children}\n </PortalPrimitive>\n </Presence>\n </PortalProvider>\n );\n};\n\nTooltipPortal.displayName = PORTAL_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * TooltipContent\n * -----------------------------------------------------------------------------------------------*/\n\nconst CONTENT_NAME = 'TooltipContent';\n\ntype TooltipContentElement = TooltipContentImplElement;\ninterface TooltipContentProps extends TooltipContentImplProps {\n /**\n * Used to force mounting when more control is needed. Useful when\n * controlling animation with React animation libraries.\n */\n forceMount?: true;\n}\n\nconst TooltipContent = React.forwardRef<TooltipContentElement, TooltipContentProps>(\n (props: ScopedProps<TooltipContentProps>, forwardedRef) => {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopeTooltip);\n const { forceMount = portalContext.forceMount, side = 'top', ...contentProps } = props;\n const context = useTooltipContext(CONTENT_NAME, props.__scopeTooltip);\n\n return (\n <Presence present={forceMount || context.open}>\n {context.disableHoverableContent ? (\n <TooltipContentImpl side={side} {...contentProps} ref={forwardedRef} />\n ) : (\n <TooltipContentHoverable side={side} {...contentProps} ref={forwardedRef} />\n )}\n </Presence>\n );\n }\n);\n\ntype Point = { x: number; y: number };\ntype Polygon = Point[];\n\ntype TooltipContentHoverableElement = TooltipContentImplElement;\ninterface TooltipContentHoverableProps extends TooltipContentImplProps {}\n\nconst TooltipContentHoverable = React.forwardRef<\n TooltipContentHoverableElement,\n TooltipContentHoverableProps\n>((props: ScopedProps<TooltipContentHoverableProps>, forwardedRef) => {\n const context = useTooltipContext(CONTENT_NAME, props.__scopeTooltip);\n const providerContext = useTooltipProviderContext(CONTENT_NAME, props.__scopeTooltip);\n const ref = React.useRef<TooltipContentHoverableElement>(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const [pointerGraceArea, setPointerGraceArea] = React.useState<Polygon | null>(null);\n\n const { trigger, onClose } = context;\n const content = ref.current;\n\n const { onPointerInTransitChange } = providerContext;\n\n const handleRemoveGraceArea = React.useCallback(() => {\n setPointerGraceArea(null);\n onPointerInTransitChange(false);\n }, [onPointerInTransitChange]);\n\n const handleCreateGraceArea = React.useCallback(\n (event: PointerEvent, hoverTarget: HTMLElement) => {\n const currentTarget = event.currentTarget as HTMLElement;\n const exitPoint = { x: event.clientX, y: event.clientY };\n const exitSide = getExitSideFromRect(exitPoint, currentTarget.getBoundingClientRect());\n const paddedExitPoints = getPaddedExitPoints(exitPoint, exitSide);\n const hoverTargetPoints = getPointsFromRect(hoverTarget.getBoundingClientRect());\n const graceArea = getHull([...paddedExitPoints, ...hoverTargetPoints]);\n setPointerGraceArea(graceArea);\n onPointerInTransitChange(true);\n },\n [onPointerInTransitChange]\n );\n\n React.useEffect(() => {\n return () => handleRemoveGraceArea();\n }, [handleRemoveGraceArea]);\n\n React.useEffect(() => {\n if (trigger && content) {\n const handleTriggerLeave = (event: PointerEvent) => handleCreateGraceArea(event, content);\n const handleContentLeave = (event: PointerEvent) => handleCreateGraceArea(event, trigger);\n\n trigger.addEventListener('pointerleave', handleTriggerLeave);\n content.addEventListener('pointerleave', handleContentLeave);\n return () => {\n trigger.removeEventListener('pointerleave', handleTriggerLeave);\n content.removeEventListener('pointerleave', handleContentLeave);\n };\n }\n }, [trigger, content, handleCreateGraceArea, handleRemoveGraceArea]);\n\n React.useEffect(() => {\n if (pointerGraceArea) {\n const handleTrackPointerGrace = (event: PointerEvent) => {\n const target = event.target as HTMLElement;\n const pointerPosition = { x: event.clientX, y: event.clientY };\n const hasEnteredTarget = trigger?.contains(target) || content?.contains(target);\n const isPointerOutsideGraceArea = !isPointInPolygon(pointerPosition, pointerGraceArea);\n\n if (hasEnteredTarget) {\n handleRemoveGraceArea();\n } else if (isPointerOutsideGraceArea) {\n handleRemoveGraceArea();\n onClose();\n }\n };\n document.addEventListener('pointermove', handleTrackPointerGrace);\n return () => document.removeEventListener('pointermove', handleTrackPointerGrace);\n }\n }, [trigger, content, pointerGraceArea, onClose, handleRemoveGraceArea]);\n\n return <TooltipContentImpl {...props} ref={composedRefs} />;\n});\n\nconst [VisuallyHiddenContentContextProvider, useVisuallyHiddenContentContext] =\n createTooltipContext(TOOLTIP_NAME, { isInside: false });\n\ntype TooltipContentImplElement = React.ComponentRef<typeof PopperPrimitive.Content>;\ntype DismissableLayerProps = React.ComponentPropsWithoutRef<typeof DismissableLayer>;\ntype PopperContentProps = React.ComponentPropsWithoutRef<typeof PopperPrimitive.Content>;\ninterface TooltipContentImplProps extends Omit<PopperContentProps, 'onPlaced'> {\n /**\n * A more descriptive label for accessibility purpose\n */\n 'aria-label'?: string;\n\n /**\n * Event handler called when the escape key is down.\n * Can be prevented.\n */\n onEscapeKeyDown?: DismissableLayerProps['onEscapeKeyDown'];\n /**\n * Event handler called when the a `pointerdown` event happens outside of the `Tooltip`.\n * Can be prevented.\n */\n onPointerDownOutside?: DismissableLayerProps['onPointerDownOutside'];\n}\n\nconst Slottable = createSlottable('TooltipContent');\n\nconst TooltipContentImpl = React.forwardRef<TooltipContentImplElement, TooltipContentImplProps>(\n (props: ScopedProps<TooltipContentImplProps>, forwardedRef) => {\n const {\n __scopeTooltip,\n children,\n 'aria-label': ariaLabel,\n onEscapeKeyDown,\n onPointerDownOutside,\n ...contentProps\n } = props;\n const context = useTooltipContext(CONTENT_NAME, __scopeTooltip);\n const popperScope = usePopperScope(__scopeTooltip);\n const { onClose } = context;\n\n // Close this tooltip if another one opens\n React.useEffect(() => {\n document.addEventListener(TOOLTIP_OPEN, onClose);\n return () => document.removeEventListener(TOOLTIP_OPEN, onClose);\n }, [onClose]);\n\n // Close the tooltip if the trigger is scrolled\n React.useEffect(() => {\n if (context.trigger) {\n const handleScroll = (event: Event) => {\n const target = event.target as HTMLElement;\n if (target?.contains(context.trigger)) onClose();\n };\n window.addEventListener('scroll', handleScroll, { capture: true });\n return () => window.removeEventListener('scroll', handleScroll, { capture: true });\n }\n }, [context.trigger, onClose]);\n\n return (\n <DismissableLayer\n asChild\n disableOutsidePointerEvents={false}\n onEscapeKeyDown={onEscapeKeyDown}\n onPointerDownOutside={onPointerDownOutside}\n onFocusOutside={(event) => event.preventDefault()}\n onDismiss={onClose}\n >\n <PopperPrimitive.Content\n data-state={context.stateAttribute}\n {...popperScope}\n {...contentProps}\n ref={forwardedRef}\n style={{\n ...contentProps.style,\n // re-namespace exposed content custom properties\n ...{\n '--radix-tooltip-content-transform-origin': 'var(--radix-popper-transform-origin)',\n '--radix-tooltip-content-available-width': 'var(--radix-popper-available-width)',\n '--radix-tooltip-content-available-height': 'var(--radix-popper-available-height)',\n '--radix-tooltip-trigger-width': 'var(--radix-popper-anchor-width)',\n '--radix-tooltip-trigger-height': 'var(--radix-popper-anchor-height)',\n },\n }}\n >\n <Slottable>{children}</Slottable>\n <VisuallyHiddenContentContextProvider scope={__scopeTooltip} isInside={true}>\n <VisuallyHiddenPrimitive.Root id={context.contentId} role=\"tooltip\">\n {ariaLabel || children}\n </VisuallyHiddenPrimitive.Root>\n </VisuallyHiddenContentContextProvider>\n </PopperPrimitive.Content>\n </DismissableLayer>\n );\n }\n);\n\nTooltipContent.displayName = CONTENT_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * TooltipArrow\n * -----------------------------------------------------------------------------------------------*/\n\nconst ARROW_NAME = 'TooltipArrow';\n\ntype TooltipArrowElement = React.ComponentRef<typeof PopperPrimitive.Arrow>;\ntype PopperArrowProps = React.ComponentPropsWithoutRef<typeof PopperPrimitive.Arrow>;\ninterface TooltipArrowProps extends PopperArrowProps {}\n\nconst TooltipArrow = React.forwardRef<TooltipArrowElement, TooltipArrowProps>(\n (props: ScopedProps<TooltipArrowProps>, forwardedRef) => {\n const { __scopeTooltip, ...arrowProps } = props;\n const popperScope = usePopperScope(__scopeTooltip);\n const visuallyHiddenContentContext = useVisuallyHiddenContentContext(\n ARROW_NAME,\n __scopeTooltip\n );\n // if the arrow is inside the `VisuallyHidden`, we don't want to render it all to\n // prevent issues in positioning the arrow due to the duplicate\n return visuallyHiddenContentContext.isInside ? null : (\n <PopperPrimitive.Arrow {...popperScope} {...arrowProps} ref={forwardedRef} />\n );\n }\n);\n\nTooltipArrow.displayName = ARROW_NAME;\n\n/* -----------------------------------------------------------------------------------------------*/\n\ntype Side = NonNullable<TooltipContentProps['side']>;\n\nfunction getExitSideFromRect(point: Point, rect: DOMRect): Side {\n const top = Math.abs(rect.top - point.y);\n const bottom = Math.abs(rect.bottom - point.y);\n const right = Math.abs(rect.right - point.x);\n const left = Math.abs(rect.left - point.x);\n\n switch (Math.min(top, bottom, right, left)) {\n case left:\n return 'left';\n case right:\n return 'right';\n case top:\n return 'top';\n case bottom:\n return 'bottom';\n default:\n throw new Error('unreachable');\n }\n}\n\nfunction getPaddedExitPoints(exitPoint: Point, exitSide: Side, padding = 5) {\n const paddedExitPoints: Point[] = [];\n switch (exitSide) {\n case 'top':\n paddedExitPoints.push(\n { x: exitPoint.x - padding, y: exitPoint.y + padding },\n { x: exitPoint.x + padding, y: exitPoint.y + padding }\n );\n break;\n case 'bottom':\n paddedExitPoints.push(\n { x: exitPoint.x - padding, y: exitPoint.y - padding },\n { x: exitPoint.x + padding, y: exitPoint.y - padding }\n );\n break;\n case 'left':\n paddedExitPoints.push(\n { x: exitPoint.x + padding, y: exitPoint.y - padding },\n { x: exitPoint.x + padding, y: exitPoint.y + padding }\n );\n break;\n case 'right':\n paddedExitPoints.push(\n { x: exitPoint.x - padding, y: exitPoint.y - padding },\n { x: exitPoint.x - padding, y: exitPoint.y + padding }\n );\n break;\n }\n return paddedExitPoints;\n}\n\nfunction getPointsFromRect(rect: DOMRect) {\n const { top, right, bottom, left } = rect;\n return [\n { x: left, y: top },\n { x: right, y: top },\n { x: right, y: bottom },\n { x: left, y: bottom },\n ];\n}\n\n// Determine if a point is inside of a polygon.\n// Based on https://github.com/substack/point-in-polygon\nfunction isPointInPolygon(point: Point, polygon: Polygon) {\n const { x, y } = point;\n let inside = false;\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n const ii = polygon[i]!;\n const jj = polygon[j]!;\n const xi = ii.x;\n const yi = ii.y;\n const xj = jj.x;\n const yj = jj.y;\n\n // prettier-ignore\n const intersect = ((yi > y) !== (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);\n if (intersect) inside = !inside;\n }\n\n return inside;\n}\n\n// Returns a new array of points representing the convex hull of the given set of points.\n// https://www.nayuki.io/page/convex-hull-algorithm\nfunction getHull<P extends Point>(points: Readonly<Array<P>>): Array<P> {\n const newPoints: Array<P> = points.slice();\n newPoints.sort((a: Point, b: Point) => {\n if (a.x < b.x) return -1;\n else if (a.x > b.x) return +1;\n else if (a.y < b.y) return -1;\n else if (a.y > b.y) return +1;\n else return 0;\n });\n return getHullPresorted(newPoints);\n}\n\n// Returns the convex hull, assuming that each points[i] <= points[i + 1]. Runs in O(n) time.\nfunction getHullPresorted<P extends Point>(points: Readonly<Array<P>>): Array<P> {\n if (points.length <= 1) return points.slice();\n\n const upperHull: Array<P> = [];\n for (let i = 0; i < points.length; i++) {\n const p = points[i]!;\n while (upperHull.length >= 2) {\n const q = upperHull[upperHull.length - 1]!;\n const r = upperHull[upperHull.length - 2]!;\n if ((q.x - r.x) * (p.y - r.y) >= (q.y - r.y) * (p.x - r.x)) upperHull.pop();\n else break;\n }\n upperHull.push(p);\n }\n upperHull.pop();\n\n const lowerHull: Array<P> = [];\n for (let i = points.length - 1; i >= 0; i--) {\n const p = points[i]!;\n while (lowerHull.length >= 2) {\n const q = lowerHull[lowerHull.length - 1]!;\n const r = lowerHull[lowerHull.length - 2]!;\n if ((q.x - r.x) * (p.y - r.y) >= (q.y - r.y) * (p.x - r.x)) lowerHull.pop();\n else break;\n }\n lowerHull.push(p);\n }\n lowerHull.pop();\n\n if (\n upperHull.length === 1 &&\n lowerHull.length === 1 &&\n upperHull[0]!.x === lowerHull[0]!.x &&\n upperHull[0]!.y === lowerHull[0]!.y\n ) {\n return upperHull;\n } else {\n return upperHull.concat(lowerHull);\n }\n}\n\nconst Provider = TooltipProvider;\nconst Root = Tooltip;\nconst Trigger = TooltipTrigger;\nconst Portal = TooltipPortal;\nconst Content = TooltipContent;\nconst Arrow = TooltipArrow;\n\nexport {\n createTooltipScope,\n //\n TooltipProvider,\n Tooltip,\n TooltipTrigger,\n TooltipPortal,\n TooltipContent,\n TooltipArrow,\n //\n Provider,\n Root,\n Trigger,\n Portal,\n Content,\n Arrow,\n};\nexport type {\n TooltipProviderProps,\n TooltipProps,\n TooltipTriggerProps,\n TooltipPortalProps,\n TooltipContentProps,\n TooltipArrowProps,\n};\n","// src/slot.tsx\nimport * as React from \"react\";\nimport { composeRefs } from \"@radix-ui/react-compose-refs\";\nimport { Fragment as Fragment2, jsx } from \"react/jsx-runtime\";\n// @__NO_SIDE_EFFECTS__\nfunction createSlot(ownerName) {\n const SlotClone = /* @__PURE__ */ createSlotClone(ownerName);\n const Slot2 = React.forwardRef((props, forwardedRef) => {\n const { children, ...slotProps } = props;\n const childrenArray = React.Children.toArray(children);\n const slottable = childrenArray.find(isSlottable);\n if (slottable) {\n const newElement = slottable.props.children;\n const newChildren = childrenArray.map((child) => {\n if (child === slottable) {\n if (React.Children.count(newElement) > 1) return React.Children.only(null);\n return React.isValidElement(newElement) ? newElement.props.children : null;\n } else {\n return child;\n }\n });\n return /* @__PURE__ */ jsx(SlotClone, { ...slotProps, ref: forwardedRef, children: React.isValidElement(newElement) ? React.cloneElement(newElement, void 0, newChildren) : null });\n }\n return /* @__PURE__ */ jsx(SlotClone, { ...slotProps, ref: forwardedRef, children });\n });\n Slot2.displayName = `${ownerName}.Slot`;\n return Slot2;\n}\nvar Slot = /* @__PURE__ */ createSlot(\"Slot\");\n// @__NO_SIDE_EFFECTS__\nfunction createSlotClone(ownerName) {\n const SlotClone = React.forwardRef((props, forwardedRef) => {\n const { children, ...slotProps } = props;\n if (React.isValidElement(children)) {\n const childrenRef = getElementRef(children);\n const props2 = mergeProps(slotProps, children.props);\n if (children.type !== React.Fragment) {\n props2.ref = forwardedRef ? composeRefs(forwardedRef, childrenRef) : childrenRef;\n }\n return React.cloneElement(children, props2);\n }\n return React.Children.count(children) > 1 ? React.Children.only(null) : null;\n });\n SlotClone.displayName = `${ownerName}.SlotClone`;\n return SlotClone;\n}\nvar SLOTTABLE_IDENTIFIER = Symbol(\"radix.slottable\");\n// @__NO_SIDE_EFFECTS__\nfunction createSlottable(ownerName) {\n const Slottable2 = ({ children }) => {\n return /* @__PURE__ */ jsx(Fragment2, { children });\n };\n Slottable2.displayName = `${ownerName}.Slottable`;\n Slottable2.__radixId = SLOTTABLE_IDENTIFIER;\n return Slottable2;\n}\nvar Slottable = /* @__PURE__ */ createSlottable(\"Slottable\");\nfunction isSlottable(child) {\n return React.isValidElement(child) && typeof child.type === \"function\" && \"__radixId\" in child.type && child.type.__radixId === SLOTTABLE_IDENTIFIER;\n}\nfunction mergeProps(slotProps, childProps) {\n const overrideProps = { ...childProps };\n for (const propName in childProps) {\n const slotPropValue = slotProps[propName];\n const childPropValue = childProps[propName];\n const isHandler = /^on[A-Z]/.test(propName);\n if (isHandler) {\n if (slotPropValue && childPropValue) {\n overrideProps[propName] = (...args) => {\n const result = childPropValue(...args);\n slotPropValue(...args);\n return result;\n };\n } else if (slotPropValue) {\n overrideProps[propName] = slotPropValue;\n }\n } else if (propName === \"style\") {\n overrideProps[propName] = { ...slotPropValue, ...childPropValue };\n } else if (propName === \"className\") {\n overrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(\" \");\n }\n }\n return { ...slotProps, ...overrideProps };\n}\nfunction getElementRef(element) {\n let getter = Object.getOwnPropertyDescriptor(element.props, \"ref\")?.get;\n let mayWarn = getter && \"isReactWarning\" in getter && getter.isReactWarning;\n if (mayWarn) {\n return element.ref;\n }\n getter = Object.getOwnPropertyDescriptor(element, \"ref\")?.get;\n mayWarn = getter && \"isReactWarning\" in getter && getter.isReactWarning;\n if (mayWarn) {\n return element.props.ref;\n }\n return element.props.ref || element.ref;\n}\nexport {\n Slot as Root,\n Slot,\n Slottable,\n createSlot,\n createSlottable\n};\n//# sourceMappingURL=index.mjs.map\n","// src/visually-hidden.tsx\nimport * as React from \"react\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { jsx } from \"react/jsx-runtime\";\nvar VISUALLY_HIDDEN_STYLES = Object.freeze({\n // See: https://github.com/twbs/bootstrap/blob/main/scss/mixins/_visually-hidden.scss\n position: \"absolute\",\n border: 0,\n width: 1,\n height: 1,\n padding: 0,\n margin: -1,\n overflow: \"hidden\",\n clip: \"rect(0, 0, 0, 0)\",\n whiteSpace: \"nowrap\",\n wordWrap: \"normal\"\n});\nvar NAME = \"VisuallyHidden\";\nvar VisuallyHidden = React.forwardRef(\n (props, forwardedRef) => {\n return /* @__PURE__ */ jsx(\n Primitive.span,\n {\n ...props,\n ref: forwardedRef,\n style: { ...VISUALLY_HIDDEN_STYLES, ...props.style }\n }\n );\n }\n);\nVisuallyHidden.displayName = NAME;\nvar Root = VisuallyHidden;\nexport {\n Root,\n VISUALLY_HIDDEN_STYLES,\n VisuallyHidden\n};\n//# sourceMappingURL=index.mjs.map\n","import { cn } from \"@/lib/cn\";\n\ntype ProgressVariant = \"default\" | \"success\" | \"error\" | \"warning\";\n\nconst variantStyles: Record<ProgressVariant, string> = {\n default: \"bg-primary\",\n success: \"bg-success\",\n error: \"bg-error\",\n warning: \"bg-warning\",\n};\n\nconst variantGlow: Record<ProgressVariant, string> = {\n default: \"shadow-progress-glow-primary\",\n success: \"shadow-progress-glow-success\",\n error: \"shadow-progress-glow-error\",\n warning: \"shadow-progress-glow-warning\",\n};\n\ninterface ProgressBarProps {\n value: number; // 0-100\n variant?: ProgressVariant;\n glow?: boolean;\n className?: string;\n}\n\nexport function ProgressBar({ value, variant = \"default\", glow = false, className }: ProgressBarProps) {\n const clamped = Math.min(100, Math.max(0, value));\n const isComplete = clamped === 100;\n return (\n <div className={cn(\"h-2 w-full overflow-hidden rounded-full bg-background-muted\", className)}>\n <div\n className={cn(\n \"h-full transition-all duration-500 ease-out\",\n variantStyles[variant],\n glow && variantGlow[variant],\n isComplete ? \"rounded-full\" : \"rounded-l-full\"\n )}\n style={{ width: `${clamped}%` }}\n />\n </div>\n );\n}\n","import { computePosition, arrow as arrow$2, autoPlacement as autoPlacement$1, flip as flip$1, hide as hide$1, inline as inline$1, limitShift as limitShift$1, offset as offset$1, shift as shift$1, size as size$1 } from '@floating-ui/dom';\nexport { autoUpdate, computePosition, detectOverflow, getOverflowAncestors, platform } from '@floating-ui/dom';\nimport * as React from 'react';\nimport { useLayoutEffect } from 'react';\nimport * as ReactDOM from 'react-dom';\n\nvar isClient = typeof document !== 'undefined';\n\nvar noop = function noop() {};\nvar index = isClient ? useLayoutEffect : noop;\n\n// Fork of `fast-deep-equal` that only does the comparisons we need and compares\n// functions\nfunction deepEqual(a, b) {\n if (a === b) {\n return true;\n }\n if (typeof a !== typeof b) {\n return false;\n }\n if (typeof a === 'function' && a.toString() === b.toString()) {\n return true;\n }\n let length;\n let i;\n let keys;\n if (a && b && typeof a === 'object') {\n if (Array.isArray(a)) {\n length = a.length;\n if (length !== b.length) return false;\n for (i = length; i-- !== 0;) {\n if (!deepEqual(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) {\n return false;\n }\n for (i = length; i-- !== 0;) {\n if (!{}.hasOwnProperty.call(b, keys[i])) {\n return false;\n }\n }\n for (i = length; i-- !== 0;) {\n const key = keys[i];\n if (key === '_owner' && a.$$typeof) {\n continue;\n }\n if (!deepEqual(a[key], b[key])) {\n return false;\n }\n }\n return true;\n }\n return a !== a && b !== b;\n}\n\nfunction getDPR(element) {\n if (typeof window === 'undefined') {\n return 1;\n }\n const win = element.ownerDocument.defaultView || window;\n return win.devicePixelRatio || 1;\n}\n\nfunction roundByDPR(element, value) {\n const dpr = getDPR(element);\n return Math.round(value * dpr) / dpr;\n}\n\nfunction useLatestRef(value) {\n const ref = React.useRef(value);\n index(() => {\n ref.current = value;\n });\n return ref;\n}\n\n/**\n * Provides data to position a floating element.\n * @see https://floating-ui.com/docs/useFloating\n */\nfunction useFloating(options) {\n if (options === void 0) {\n options = {};\n }\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform,\n elements: {\n reference: externalReference,\n floating: externalFloating\n } = {},\n transform = true,\n whileElementsMounted,\n open\n } = options;\n const [data, setData] = React.useState({\n x: 0,\n y: 0,\n strategy,\n placement,\n middlewareData: {},\n isPositioned: false\n });\n const [latestMiddleware, setLatestMiddleware] = React.useState(middleware);\n if (!deepEqual(latestMiddleware, middleware)) {\n setLatestMiddleware(middleware);\n }\n const [_reference, _setReference] = React.useState(null);\n const [_floating, _setFloating] = React.useState(null);\n const setReference = React.useCallback(node => {\n if (node !== referenceRef.current) {\n referenceRef.current = node;\n _setReference(node);\n }\n }, []);\n const setFloating = React.useCallback(node => {\n if (node !== floatingRef.current) {\n floatingRef.current = node;\n _setFloating(node);\n }\n }, []);\n const referenceEl = externalReference || _reference;\n const floatingEl = externalFloating || _floating;\n const referenceRef = React.useRef(null);\n const floatingRef = React.useRef(null);\n const dataRef = React.useRef(data);\n const hasWhileElementsMounted = whileElementsMounted != null;\n const whileElementsMountedRef = useLatestRef(whileElementsMounted);\n const platformRef = useLatestRef(platform);\n const openRef = useLatestRef(open);\n const update = React.useCallback(() => {\n if (!referenceRef.current || !floatingRef.current) {\n return;\n }\n const config = {\n placement,\n strategy,\n middleware: latestMiddleware\n };\n if (platformRef.current) {\n config.platform = platformRef.current;\n }\n computePosition(referenceRef.current, floatingRef.current, config).then(data => {\n const fullData = {\n ...data,\n // The floating element's position may be recomputed while it's closed\n // but still mounted (such as when transitioning out). To ensure\n // `isPositioned` will be `false` initially on the next open, avoid\n // setting it to `true` when `open === false` (must be specified).\n isPositioned: openRef.current !== false\n };\n if (isMountedRef.current && !deepEqual(dataRef.current, fullData)) {\n dataRef.current = fullData;\n ReactDOM.flushSync(() => {\n setData(fullData);\n });\n }\n });\n }, [latestMiddleware, placement, strategy, platformRef, openRef]);\n index(() => {\n if (open === false && dataRef.current.isPositioned) {\n dataRef.current.isPositioned = false;\n setData(data => ({\n ...data,\n isPositioned: false\n }));\n }\n }, [open]);\n const isMountedRef = React.useRef(false);\n index(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n index(() => {\n if (referenceEl) referenceRef.current = referenceEl;\n if (floatingEl) floatingRef.current = floatingEl;\n if (referenceEl && floatingEl) {\n if (whileElementsMountedRef.current) {\n return whileElementsMountedRef.current(referenceEl, floatingEl, update);\n }\n update();\n }\n }, [referenceEl, floatingEl, update, whileElementsMountedRef, hasWhileElementsMounted]);\n const refs = React.useMemo(() => ({\n reference: referenceRef,\n floating: floatingRef,\n setReference,\n setFloating\n }), [setReference, setFloating]);\n const elements = React.useMemo(() => ({\n reference: referenceEl,\n floating: floatingEl\n }), [referenceEl, floatingEl]);\n const floatingStyles = React.useMemo(() => {\n const initialStyles = {\n position: strategy,\n left: 0,\n top: 0\n };\n if (!elements.floating) {\n return initialStyles;\n }\n const x = roundByDPR(elements.floating, data.x);\n const y = roundByDPR(elements.floating, data.y);\n if (transform) {\n return {\n ...initialStyles,\n transform: \"translate(\" + x + \"px, \" + y + \"px)\",\n ...(getDPR(elements.floating) >= 1.5 && {\n willChange: 'transform'\n })\n };\n }\n return {\n position: strategy,\n left: x,\n top: y\n };\n }, [strategy, transform, elements.floating, data.x, data.y]);\n return React.useMemo(() => ({\n ...data,\n update,\n refs,\n elements,\n floatingStyles\n }), [data, update, refs, elements, floatingStyles]);\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * This wraps the core `arrow` middleware to allow React refs as the element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow$1 = options => {\n function isRef(value) {\n return {}.hasOwnProperty.call(value, 'current');\n }\n return {\n name: 'arrow',\n options,\n fn(state) {\n const {\n element,\n padding\n } = typeof options === 'function' ? options(state) : options;\n if (element && isRef(element)) {\n if (element.current != null) {\n return arrow$2({\n element: element.current,\n padding\n }).fn(state);\n }\n return {};\n }\n if (element) {\n return arrow$2({\n element,\n padding\n }).fn(state);\n }\n return {};\n }\n };\n};\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = (options, deps) => {\n const result = offset$1(options);\n return {\n name: result.name,\n fn: result.fn,\n options: [options, deps]\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = (options, deps) => {\n const result = shift$1(options);\n return {\n name: result.name,\n fn: result.fn,\n options: [options, deps]\n };\n};\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = (options, deps) => {\n const result = limitShift$1(options);\n return {\n fn: result.fn,\n options: [options, deps]\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = (options, deps) => {\n const result = flip$1(options);\n return {\n name: result.name,\n fn: result.fn,\n options: [options, deps]\n };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = (options, deps) => {\n const result = size$1(options);\n return {\n name: result.name,\n fn: result.fn,\n options: [options, deps]\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = (options, deps) => {\n const result = autoPlacement$1(options);\n return {\n name: result.name,\n fn: result.fn,\n options: [options, deps]\n };\n};\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = (options, deps) => {\n const result = hide$1(options);\n return {\n name: result.name,\n fn: result.fn,\n options: [options, deps]\n };\n};\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = (options, deps) => {\n const result = inline$1(options);\n return {\n name: result.name,\n fn: result.fn,\n options: [options, deps]\n };\n};\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * This wraps the core `arrow` middleware to allow React refs as the element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = (options, deps) => {\n const result = arrow$1(options);\n return {\n name: result.name,\n fn: result.fn,\n options: [options, deps]\n };\n};\n\nexport { arrow, autoPlacement, flip, hide, inline, limitShift, offset, shift, size, useFloating };\n","import * as React from 'react'\nimport { flushSync } from 'react-dom'\nimport {\n Virtualizer,\n elementScroll,\n observeElementOffset,\n observeElementRect,\n observeWindowOffset,\n observeWindowRect,\n windowScroll,\n} from '@tanstack/virtual-core'\nimport type { PartialKeys, VirtualizerOptions } from '@tanstack/virtual-core'\n\nexport * from '@tanstack/virtual-core'\n\nconst useIsomorphicLayoutEffect =\n typeof document !== 'undefined' ? React.useLayoutEffect : React.useEffect\n\nexport type ReactVirtualizerOptions<\n TScrollElement extends Element | Window,\n TItemElement extends Element,\n> = VirtualizerOptions<TScrollElement, TItemElement> & {\n useFlushSync?: boolean\n}\n\nfunction useVirtualizerBase<\n TScrollElement extends Element | Window,\n TItemElement extends Element,\n>({\n useFlushSync = true,\n ...options\n}: ReactVirtualizerOptions<TScrollElement, TItemElement>): Virtualizer<\n TScrollElement,\n TItemElement\n> {\n const rerender = React.useReducer(() => ({}), {})[1]\n\n const resolvedOptions: VirtualizerOptions<TScrollElement, TItemElement> = {\n ...options,\n onChange: (instance, sync) => {\n if (useFlushSync && sync) {\n flushSync(rerender)\n } else {\n rerender()\n }\n options.onChange?.(instance, sync)\n },\n }\n\n const [instance] = React.useState(\n () => new Virtualizer<TScrollElement, TItemElement>(resolvedOptions),\n )\n\n instance.setOptions(resolvedOptions)\n\n useIsomorphicLayoutEffect(() => {\n return instance._didMount()\n }, [])\n\n useIsomorphicLayoutEffect(() => {\n return instance._willUpdate()\n })\n\n return instance\n}\n\nexport function useVirtualizer<\n TScrollElement extends Element,\n TItemElement extends Element,\n>(\n options: PartialKeys<\n ReactVirtualizerOptions<TScrollElement, TItemElement>,\n 'observeElementRect' | 'observeElementOffset' | 'scrollToFn'\n >,\n): Virtualizer<TScrollElement, TItemElement> {\n return useVirtualizerBase<TScrollElement, TItemElement>({\n observeElementRect: observeElementRect,\n observeElementOffset: observeElementOffset,\n scrollToFn: elementScroll,\n ...options,\n })\n}\n\nexport function useWindowVirtualizer<TItemElement extends Element>(\n options: PartialKeys<\n ReactVirtualizerOptions<Window, TItemElement>,\n | 'getScrollElement'\n | 'observeElementRect'\n | 'observeElementOffset'\n | 'scrollToFn'\n >,\n): Virtualizer<Window, TItemElement> {\n return useVirtualizerBase<Window, TItemElement>({\n getScrollElement: () => (typeof document !== 'undefined' ? window : null),\n observeElementRect: observeWindowRect,\n observeElementOffset: observeWindowOffset,\n scrollToFn: windowScroll,\n initialOffset: () => (typeof document !== 'undefined' ? window.scrollY : 0),\n ...options,\n })\n}\n","import { rectToClientRect, arrow as arrow$1, autoPlacement as autoPlacement$1, detectOverflow as detectOverflow$1, flip as flip$1, hide as hide$1, inline as inline$1, limitShift as limitShift$1, offset as offset$1, shift as shift$1, size as size$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle as getComputedStyle$1, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getNodeScroll, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n const css = getComputedStyle$1(element);\n // In testing environments, the `width` and `height` properties are empty\n // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n let width = parseFloat(css.width) || 0;\n let height = parseFloat(css.height) || 0;\n const hasOffset = isHTMLElement(element);\n const offsetWidth = hasOffset ? element.offsetWidth : width;\n const offsetHeight = hasOffset ? element.offsetHeight : height;\n const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n if (shouldFallback) {\n width = offsetWidth;\n height = offsetHeight;\n }\n return {\n width,\n height,\n $: shouldFallback\n };\n}\n\nfunction unwrapElement(element) {\n return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n const domElement = unwrapElement(element);\n if (!isHTMLElement(domElement)) {\n return createCoords(1);\n }\n const rect = domElement.getBoundingClientRect();\n const {\n width,\n height,\n $\n } = getCssDimensions(domElement);\n let x = ($ ? round(rect.width) : rect.width) / width;\n let y = ($ ? round(rect.height) : rect.height) / height;\n\n // 0, NaN, or Infinity should always fallback to 1.\n\n if (!x || !Number.isFinite(x)) {\n x = 1;\n }\n if (!y || !Number.isFinite(y)) {\n y = 1;\n }\n return {\n x,\n y\n };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n const win = getWindow(element);\n if (!isWebKit() || !win.visualViewport) {\n return noOffsets;\n }\n return {\n x: win.visualViewport.offsetLeft,\n y: win.visualViewport.offsetTop\n };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n return false;\n }\n return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n const clientRect = element.getBoundingClientRect();\n const domElement = unwrapElement(element);\n let scale = createCoords(1);\n if (includeScale) {\n if (offsetParent) {\n if (isElement(offsetParent)) {\n scale = getScale(offsetParent);\n }\n } else {\n scale = getScale(element);\n }\n }\n const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n let x = (clientRect.left + visualOffsets.x) / scale.x;\n let y = (clientRect.top + visualOffsets.y) / scale.y;\n let width = clientRect.width / scale.x;\n let height = clientRect.height / scale.y;\n if (domElement) {\n const win = getWindow(domElement);\n const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n let currentWin = win;\n let currentIFrame = getFrameElement(currentWin);\n while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n const iframeScale = getScale(currentIFrame);\n const iframeRect = currentIFrame.getBoundingClientRect();\n const css = getComputedStyle$1(currentIFrame);\n const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n x *= iframeScale.x;\n y *= iframeScale.y;\n width *= iframeScale.x;\n height *= iframeScale.y;\n x += left;\n y += top;\n currentWin = getWindow(currentIFrame);\n currentIFrame = getFrameElement(currentWin);\n }\n }\n return rectToClientRect({\n width,\n height,\n x,\n y\n });\n}\n\n// If <html> has a CSS width greater than the viewport, then this will be\n// incorrect for RTL.\nfunction getWindowScrollBarX(element, rect) {\n const leftScroll = getNodeScroll(element).scrollLeft;\n if (!rect) {\n return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;\n }\n return rect.left + leftScroll;\n}\n\nfunction getHTMLOffset(documentElement, scroll) {\n const htmlRect = documentElement.getBoundingClientRect();\n const x = htmlRect.left + scroll.scrollLeft - getWindowScrollBarX(documentElement, htmlRect);\n const y = htmlRect.top + scroll.scrollTop;\n return {\n x,\n y\n };\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n elements,\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isFixed = strategy === 'fixed';\n const documentElement = getDocumentElement(offsetParent);\n const topLayer = elements ? isTopLayer(elements.floating) : false;\n if (offsetParent === documentElement || topLayer && isFixed) {\n return rect;\n }\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n let scale = createCoords(1);\n const offsets = createCoords(0);\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isOffsetParentAnElement) {\n const offsetRect = getBoundingClientRect(offsetParent);\n scale = getScale(offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n }\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n return {\n width: rect.width * scale.x,\n height: rect.height * scale.y,\n x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,\n y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y\n };\n}\n\nfunction getClientRects(element) {\n return Array.from(element.getClientRects());\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = element.ownerDocument.body;\n const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n if (getComputedStyle$1(body).direction === 'rtl') {\n x += max(html.clientWidth, body.clientWidth) - width;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// Safety check: ensure the scrollbar space is reasonable in case this\n// calculation is affected by unusual styles.\n// Most scrollbars leave 15-18px of space.\nconst SCROLLBAR_MAX = 25;\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const visualViewportBased = isWebKit();\n if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n const windowScrollbarX = getWindowScrollBarX(html);\n // <html> `overflow: hidden` + `scrollbar-gutter: stable` reduces the\n // visual width of the <html> but this is not considered in the size\n // of `html.clientWidth`.\n if (windowScrollbarX <= 0) {\n const doc = html.ownerDocument;\n const body = doc.body;\n const bodyStyles = getComputedStyle(body);\n const bodyMarginInline = doc.compatMode === 'CSS1Compat' ? parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight) || 0 : 0;\n const clippingStableScrollbarWidth = Math.abs(html.clientWidth - body.clientWidth - bodyMarginInline);\n if (clippingStableScrollbarWidth <= SCROLLBAR_MAX) {\n width -= clippingStableScrollbarWidth;\n }\n } else if (windowScrollbarX <= SCROLLBAR_MAX) {\n // If the <body> scrollbar is on the left, the width needs to be extended\n // by the scrollbar amount so there isn't extra space on the right.\n width += windowScrollbarX;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n const width = element.clientWidth * scale.x;\n const height = element.clientHeight * scale.y;\n const x = left * scale.x;\n const y = top * scale.y;\n return {\n width,\n height,\n x,\n y\n };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n let rect;\n if (clippingAncestor === 'viewport') {\n rect = getViewportRect(element, strategy);\n } else if (clippingAncestor === 'document') {\n rect = getDocumentRect(getDocumentElement(element));\n } else if (isElement(clippingAncestor)) {\n rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n } else {\n const visualOffsets = getVisualOffsets(element);\n rect = {\n x: clippingAncestor.x - visualOffsets.x,\n y: clippingAncestor.y - visualOffsets.y,\n width: clippingAncestor.width,\n height: clippingAncestor.height\n };\n }\n return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n const parentNode = getParentNode(element);\n if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n return false;\n }\n return getComputedStyle$1(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n const cachedResult = cache.get(element);\n if (cachedResult) {\n return cachedResult;\n }\n let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n let currentContainingBlockComputedStyle = null;\n const elementIsFixed = getComputedStyle$1(element).position === 'fixed';\n let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n const computedStyle = getComputedStyle$1(currentNode);\n const currentNodeIsContaining = isContainingBlock(currentNode);\n if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n currentContainingBlockComputedStyle = null;\n }\n const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && (currentContainingBlockComputedStyle.position === 'absolute' || currentContainingBlockComputedStyle.position === 'fixed') || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n if (shouldDropCurrentNode) {\n // Drop non-containing blocks.\n result = result.filter(ancestor => ancestor !== currentNode);\n } else {\n // Record last containing block for next iteration.\n currentContainingBlockComputedStyle = computedStyle;\n }\n currentNode = getParentNode(currentNode);\n }\n cache.set(element, result);\n return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n const firstRect = getClientRectFromClippingAncestor(element, clippingAncestors[0], strategy);\n let top = firstRect.top;\n let right = firstRect.right;\n let bottom = firstRect.bottom;\n let left = firstRect.left;\n for (let i = 1; i < clippingAncestors.length; i++) {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestors[i], strategy);\n top = max(rect.top, top);\n right = min(rect.right, right);\n bottom = min(rect.bottom, bottom);\n left = max(rect.left, left);\n }\n return {\n width: right - left,\n height: bottom - top,\n x: left,\n y: top\n };\n}\n\nfunction getDimensions(element) {\n const {\n width,\n height\n } = getCssDimensions(element);\n return {\n width,\n height\n };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const isFixed = strategy === 'fixed';\n const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = createCoords(0);\n\n // If the <body> scrollbar appears on the left (e.g. RTL systems). Use\n // Firefox with layout.scrollbar.side = 3 in about:config to test this.\n function setLeftRTLScrollbarOffset() {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isOffsetParentAnElement) {\n const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n setLeftRTLScrollbarOffset();\n }\n }\n if (isFixed && !isOffsetParentAnElement && documentElement) {\n setLeftRTLScrollbarOffset();\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;\n const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;\n return {\n x,\n y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction isStaticPositioned(element) {\n return getComputedStyle$1(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle$1(element).position === 'fixed') {\n return null;\n }\n if (polyfill) {\n return polyfill(element);\n }\n let rawOffsetParent = element.offsetParent;\n\n // Firefox returns the <html> element as the offsetParent if it's non-static,\n // while Chrome and Safari return the <body> element. The <body> element must\n // be used to perform the correct calculations even if the <html> element is\n // non-static.\n if (getDocumentElement(element) === rawOffsetParent) {\n rawOffsetParent = rawOffsetParent.ownerDocument.body;\n }\n return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n const win = getWindow(element);\n if (isTopLayer(element)) {\n return win;\n }\n if (!isHTMLElement(element)) {\n let svgOffsetParent = getParentNode(element);\n while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n return svgOffsetParent;\n }\n svgOffsetParent = getParentNode(svgOffsetParent);\n }\n return win;\n }\n let offsetParent = getTrueOffsetParent(element, polyfill);\n while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n }\n if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n return win;\n }\n return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n const getDimensionsFn = this.getDimensions;\n const floatingDimensions = await getDimensionsFn(data.floating);\n return {\n reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n floating: {\n x: 0,\n y: 0,\n width: floatingDimensions.width,\n height: floatingDimensions.height\n }\n };\n};\n\nfunction isRTL(element) {\n return getComputedStyle$1(element).direction === 'rtl';\n}\n\nconst platform = {\n convertOffsetParentRelativeRectToViewportRelativeRect,\n getDocumentElement,\n getClippingRect,\n getOffsetParent,\n getElementRects,\n getClientRects,\n getDimensions,\n getScale,\n isElement,\n isRTL\n};\n\nfunction rectsAreEqual(a, b) {\n return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n}\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n let io = null;\n let timeoutId;\n const root = getDocumentElement(element);\n function cleanup() {\n var _io;\n clearTimeout(timeoutId);\n (_io = io) == null || _io.disconnect();\n io = null;\n }\n function refresh(skip, threshold) {\n if (skip === void 0) {\n skip = false;\n }\n if (threshold === void 0) {\n threshold = 1;\n }\n cleanup();\n const elementRectForRootMargin = element.getBoundingClientRect();\n const {\n left,\n top,\n width,\n height\n } = elementRectForRootMargin;\n if (!skip) {\n onMove();\n }\n if (!width || !height) {\n return;\n }\n const insetTop = floor(top);\n const insetRight = floor(root.clientWidth - (left + width));\n const insetBottom = floor(root.clientHeight - (top + height));\n const insetLeft = floor(left);\n const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n const options = {\n rootMargin,\n threshold: max(0, min(1, threshold)) || 1\n };\n let isFirstUpdate = true;\n function handleObserve(entries) {\n const ratio = entries[0].intersectionRatio;\n if (ratio !== threshold) {\n if (!isFirstUpdate) {\n return refresh();\n }\n if (!ratio) {\n // If the reference is clipped, the ratio is 0. Throttle the refresh\n // to prevent an infinite loop of updates.\n timeoutId = setTimeout(() => {\n refresh(false, 1e-7);\n }, 1000);\n } else {\n refresh(false, ratio);\n }\n }\n if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {\n // It's possible that even though the ratio is reported as 1, the\n // element is not actually fully within the IntersectionObserver's root\n // area anymore. This can happen under performance constraints. This may\n // be a bug in the browser's IntersectionObserver implementation. To\n // work around this, we compare the element's bounding rect now with\n // what it was at the time we created the IntersectionObserver. If they\n // are not equal then the element moved, so we refresh.\n refresh();\n }\n isFirstUpdate = false;\n }\n\n // Older browsers don't support a `document` as the root and will throw an\n // error.\n try {\n io = new IntersectionObserver(handleObserve, {\n ...options,\n // Handle <iframe>s\n root: root.ownerDocument\n });\n } catch (_e) {\n io = new IntersectionObserver(handleObserve, options);\n }\n io.observe(element);\n }\n refresh(true);\n return cleanup;\n}\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * Should only be called when the floating element is mounted on the DOM or\n * visible on the screen.\n * @returns cleanup function that should be invoked when the floating element is\n * removed from the DOM or hidden from the screen.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n if (options === void 0) {\n options = {};\n }\n const {\n ancestorScroll = true,\n ancestorResize = true,\n elementResize = typeof ResizeObserver === 'function',\n layoutShift = typeof IntersectionObserver === 'function',\n animationFrame = false\n } = options;\n const referenceEl = unwrapElement(reference);\n const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...(floating ? getOverflowAncestors(floating) : [])] : [];\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.addEventListener('scroll', update, {\n passive: true\n });\n ancestorResize && ancestor.addEventListener('resize', update);\n });\n const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;\n let reobserveFrame = -1;\n let resizeObserver = null;\n if (elementResize) {\n resizeObserver = new ResizeObserver(_ref => {\n let [firstEntry] = _ref;\n if (firstEntry && firstEntry.target === referenceEl && resizeObserver && floating) {\n // Prevent update loops when using the `size` middleware.\n // https://github.com/floating-ui/floating-ui/issues/1740\n resizeObserver.unobserve(floating);\n cancelAnimationFrame(reobserveFrame);\n reobserveFrame = requestAnimationFrame(() => {\n var _resizeObserver;\n (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n });\n }\n update();\n });\n if (referenceEl && !animationFrame) {\n resizeObserver.observe(referenceEl);\n }\n if (floating) {\n resizeObserver.observe(floating);\n }\n }\n let frameId;\n let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n if (animationFrame) {\n frameLoop();\n }\n function frameLoop() {\n const nextRefRect = getBoundingClientRect(reference);\n if (prevRefRect && !rectsAreEqual(prevRefRect, nextRefRect)) {\n update();\n }\n prevRefRect = nextRefRect;\n frameId = requestAnimationFrame(frameLoop);\n }\n update();\n return () => {\n var _resizeObserver2;\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.removeEventListener('scroll', update);\n ancestorResize && ancestor.removeEventListener('resize', update);\n });\n cleanupIo == null || cleanupIo();\n (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();\n resizeObserver = null;\n if (animationFrame) {\n cancelAnimationFrame(frameId);\n }\n };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nconst detectOverflow = detectOverflow$1;\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = offset$1;\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = autoPlacement$1;\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = shift$1;\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = flip$1;\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = size$1;\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = hide$1;\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = arrow$1;\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = inline$1;\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = limitShift$1;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n */\nconst computePosition = (reference, floating, options) => {\n // This caches the expensive `getClippingElementAncestors` function so that\n // multiple lifecycle resets re-use the same result. It only lives for a\n // single call. If other functions become expensive, we can add them as well.\n const cache = new Map();\n const mergedOptions = {\n platform,\n ...options\n };\n const platformWithCache = {\n ...mergedOptions.platform,\n _c: cache\n };\n return computePosition$1(reference, floating, {\n ...mergedOptions,\n platform: platformWithCache\n });\n};\n\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, platform, shift, size };\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name ArrowRight\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNSAxMmgxNCIgLz4KICA8cGF0aCBkPSJtMTIgNSA3IDctNyA3IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/arrow-right\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ArrowRight = createLucideIcon('ArrowRight', [\n ['path', { d: 'M5 12h14', key: '1ays0h' }],\n ['path', { d: 'm12 5 7 7-7 7', key: 'xquz4c' }],\n]);\n\nexport default ArrowRight;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name History\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyAxMmE5IDkgMCAxIDAgOS05IDkuNzUgOS43NSAwIDAgMC02Ljc0IDIuNzRMMyA4IiAvPgogIDxwYXRoIGQ9Ik0zIDN2NWg1IiAvPgogIDxwYXRoIGQ9Ik0xMiA3djVsNCAyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/history\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst History = createLucideIcon('History', [\n ['path', { d: 'M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8', key: '1357e3' }],\n ['path', { d: 'M3 3v5h5', key: '1xhq8a' }],\n ['path', { d: 'M12 7v5l4 2', key: '1fdv2h' }],\n]);\n\nexport default History;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Hand\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTggMTFWNmEyIDIgMCAwIDAtMi0ydjBhMiAyIDAgMCAwLTIgMnYwIiAvPgogIDxwYXRoIGQ9Ik0xNCAxMFY0YTIgMiAwIDAgMC0yLTJ2MGEyIDIgMCAwIDAtMiAydjIiIC8+CiAgPHBhdGggZD0iTTEwIDEwLjVWNmEyIDIgMCAwIDAtMi0ydjBhMiAyIDAgMCAwLTIgMnY4IiAvPgogIDxwYXRoIGQ9Ik0xOCA4YTIgMiAwIDEgMSA0IDB2NmE4IDggMCAwIDEtOCA4aC0yYy0yLjggMC00LjUtLjg2LTUuOTktMi4zNGwtMy42LTMuNmEyIDIgMCAwIDEgMi44My0yLjgyTDcgMTUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/hand\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Hand = createLucideIcon('Hand', [\n ['path', { d: 'M18 11V6a2 2 0 0 0-2-2v0a2 2 0 0 0-2 2v0', key: 'aigmz7' }],\n ['path', { d: 'M14 10V4a2 2 0 0 0-2-2v0a2 2 0 0 0-2 2v2', key: '1n6bmn' }],\n ['path', { d: 'M10 10.5V6a2 2 0 0 0-2-2v0a2 2 0 0 0-2 2v8', key: 'a9iiix' }],\n [\n 'path',\n {\n d: 'M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15',\n key: '1s1gnw',\n },\n ],\n]);\n\nexport default Hand;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Activity\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjIgMTJoLTRsLTMgOUw5IDNsLTMgOUgyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/activity\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Activity = createLucideIcon('Activity', [\n ['path', { d: 'M22 12h-4l-3 9L9 3l-3 9H2', key: 'd5dnw9' }],\n]);\n\nexport default Activity;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name ChevronRight\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtOSAxOCA2LTYtNi02IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/chevron-right\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ChevronRight = createLucideIcon('ChevronRight', [\n ['path', { d: 'm9 18 6-6-6-6', key: 'mthhwq' }],\n]);\n\nexport default ChevronRight;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name ChevronUp\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTggMTUtNi02LTYgNiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/chevron-up\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ChevronUp = createLucideIcon('ChevronUp', [['path', { d: 'm18 15-6-6-6 6', key: '153udz' }]]);\n\nexport default ChevronUp;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name ChevronDown\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtNiA5IDYgNiA2LTYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/chevron-down\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ChevronDown = createLucideIcon('ChevronDown', [\n ['path', { d: 'm6 9 6 6 6-6', key: 'qrunsl' }],\n]);\n\nexport default ChevronDown;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name AlertCircle\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8bGluZSB4MT0iMTIiIHgyPSIxMiIgeTE9IjgiIHkyPSIxMiIgLz4KICA8bGluZSB4MT0iMTIiIHgyPSIxMi4wMSIgeTE9IjE2IiB5Mj0iMTYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/alert-circle\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst AlertCircle = createLucideIcon('AlertCircle', [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['line', { x1: '12', x2: '12', y1: '8', y2: '12', key: '1pkeuh' }],\n ['line', { x1: '12', x2: '12.01', y1: '16', y2: '16', key: '4dfq90' }],\n]);\n\nexport default AlertCircle;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Circle\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/circle\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Circle = createLucideIcon('Circle', [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n]);\n\nexport default Circle;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name ChevronLeft\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTUgMTgtNi02IDYtNiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/chevron-left\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ChevronLeft = createLucideIcon('ChevronLeft', [\n ['path', { d: 'm15 18-6-6 6-6', key: '1wnfg3' }],\n]);\n\nexport default ChevronLeft;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Inbox\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cG9seWxpbmUgcG9pbnRzPSIyMiAxMiAxNiAxMiAxNCAxNSAxMCAxNSA4IDEyIDIgMTIiIC8+CiAgPHBhdGggZD0iTTUuNDUgNS4xMSAyIDEydjZhMiAyIDAgMCAwIDIgMmgxNmEyIDIgMCAwIDAgMi0ydi02bC0zLjQ1LTYuODlBMiAyIDAgMCAwIDE2Ljc2IDRINy4yNGEyIDIgMCAwIDAtMS43OSAxLjExeiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/inbox\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Inbox = createLucideIcon('Inbox', [\n ['polyline', { points: '22 12 16 12 14 15 10 15 8 12 2 12', key: 'o97t9d' }],\n [\n 'path',\n {\n d: 'M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z',\n key: 'oot6mr',\n },\n ],\n]);\n\nexport default Inbox;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name ArrowUpDown\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMjEgMTYtNCA0LTQtNCIgLz4KICA8cGF0aCBkPSJNMTcgMjBWNCIgLz4KICA8cGF0aCBkPSJtMyA4IDQtNCA0IDQiIC8+CiAgPHBhdGggZD0iTTcgNHYxNiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/arrow-up-down\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ArrowUpDown = createLucideIcon('ArrowUpDown', [\n ['path', { d: 'm21 16-4 4-4-4', key: 'f6ql7i' }],\n ['path', { d: 'M17 20V4', key: '1ejh1v' }],\n ['path', { d: 'm3 8 4-4 4 4', key: '11wl7u' }],\n ['path', { d: 'M7 4v16', key: '1glfcx' }],\n]);\n\nexport default ArrowUpDown;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Search\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMSIgY3k9IjExIiByPSI4IiAvPgogIDxwYXRoIGQ9Im0yMSAyMS00LjMtNC4zIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/search\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Search = createLucideIcon('Search', [\n ['circle', { cx: '11', cy: '11', r: '8', key: '4ej97u' }],\n ['path', { d: 'm21 21-4.3-4.3', key: '1qie3q' }],\n]);\n\nexport default Search;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Tag\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIuNTg2IDIuNTg2QTIgMiAwIDAgMCAxMS4xNzIgMkg0YTIgMiAwIDAgMC0yIDJ2Ny4xNzJhMiAyIDAgMCAwIC41ODYgMS40MTRsOC43MDQgOC43MDRhMi40MjYgMi40MjYgMCAwIDAgMy40MiAwbDYuNTgtNi41OGEyLjQyNiAyLjQyNiAwIDAgMCAwLTMuNDJ6IiAvPgogIDxjaXJjbGUgY3g9IjcuNSIgY3k9IjcuNSIgcj0iLjUiIGZpbGw9ImN1cnJlbnRDb2xvciIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/tag\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Tag = createLucideIcon('Tag', [\n [\n 'path',\n {\n d: 'M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z',\n key: 'vktsd0',\n },\n ],\n ['circle', { cx: '7.5', cy: '7.5', r: '.5', fill: 'currentColor', key: 'kqv944' }],\n]);\n\nexport default Tag;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Layers\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTIuODMgMi4xOGEyIDIgMCAwIDAtMS42NiAwTDIuNiA2LjA4YTEgMSAwIDAgMCAwIDEuODNsOC41OCAzLjkxYTIgMiAwIDAgMCAxLjY2IDBsOC41OC0zLjlhMSAxIDAgMCAwIDAtMS44M1oiIC8+CiAgPHBhdGggZD0ibTIyIDE3LjY1LTkuMTcgNC4xNmEyIDIgMCAwIDEtMS42NiAwTDIgMTcuNjUiIC8+CiAgPHBhdGggZD0ibTIyIDEyLjY1LTkuMTcgNC4xNmEyIDIgMCAwIDEtMS42NiAwTDIgMTIuNjUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/layers\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Layers = createLucideIcon('Layers', [\n [\n 'path',\n {\n d: 'm12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83Z',\n key: '8b97xw',\n },\n ],\n ['path', { d: 'm22 17.65-9.17 4.16a2 2 0 0 1-1.66 0L2 17.65', key: 'dd6zsq' }],\n ['path', { d: 'm22 12.65-9.17 4.16a2 2 0 0 1-1.66 0L2 12.65', key: 'ep9fru' }],\n]);\n\nexport default Layers;\n"],"names":["callServer","createServerReference","findSourceMapURL","interval","sseFilter","event","refresh","useProjects","type","suppressSseRefetch","data","loading","error","projects","recentCompletionWindowMs","instance","opts","key"],"mappings":"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","ignoreList":[0,11,12,13,15,16,28,29,30,31,32,33,34,38,39,40,41,42,43,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62]}