vibedoc 1.9.0 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (570) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/prerender-manifest.json +13 -13
  4. package/.next/server/app/(app)/activity/page.js.nft.json +1 -1
  5. package/.next/server/app/(app)/activity/page_client-reference-manifest.js +1 -1
  6. package/.next/server/app/(app)/board/page.js.nft.json +1 -1
  7. package/.next/server/app/(app)/board/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/(app)/chat/page.js.nft.json +1 -1
  9. package/.next/server/app/(app)/chat/page_client-reference-manifest.js +1 -1
  10. package/.next/server/app/(app)/docs/page.js.nft.json +1 -1
  11. package/.next/server/app/(app)/docs/page_client-reference-manifest.js +1 -1
  12. package/.next/server/app/(app)/explorer/page.js.nft.json +1 -1
  13. package/.next/server/app/(app)/explorer/page_client-reference-manifest.js +1 -1
  14. package/.next/server/app/(app)/manual-tests/page.js.nft.json +1 -1
  15. package/.next/server/app/(app)/manual-tests/page_client-reference-manifest.js +1 -1
  16. package/.next/server/app/(app)/memory/page.js.nft.json +1 -1
  17. package/.next/server/app/(app)/memory/page_client-reference-manifest.js +1 -1
  18. package/.next/server/app/(app)/roadmap/page.js.nft.json +1 -1
  19. package/.next/server/app/(app)/roadmap/page_client-reference-manifest.js +1 -1
  20. package/.next/server/app/(app)/settings/page.js.nft.json +1 -1
  21. package/.next/server/app/(app)/settings/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/(app)/setup/page.js.nft.json +1 -1
  23. package/.next/server/app/(app)/setup/page_client-reference-manifest.js +1 -1
  24. package/.next/server/app/_global-error.html +1 -1
  25. package/.next/server/app/_global-error.rsc +1 -1
  26. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  27. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  28. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  29. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  30. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  31. package/.next/server/app/_not-found.html +1 -1
  32. package/.next/server/app/_not-found.rsc +2 -2
  33. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  34. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  35. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  36. package/.next/server/app/activity.html +1 -1
  37. package/.next/server/app/activity.rsc +23 -22
  38. package/.next/server/app/activity.segments/!KGFwcCk/activity/__PAGE__.segment.rsc +9 -11
  39. package/.next/server/app/activity.segments/_full.segment.rsc +23 -22
  40. package/.next/server/app/activity.segments/_tree.segment.rsc +2 -2
  41. package/.next/server/app/api/activity/route.js +1 -1
  42. package/.next/server/app/api/activity/route.js.nft.json +1 -1
  43. package/.next/server/app/api/backlinks/route.js +1 -1
  44. package/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  45. package/.next/server/app/api/chat/route.js +1 -1
  46. package/.next/server/app/api/chat/route.js.nft.json +1 -1
  47. package/.next/server/app/api/context/route.js +1 -1
  48. package/.next/server/app/api/context/route.js.nft.json +1 -1
  49. package/.next/server/app/api/conversations/route.js +1 -1
  50. package/.next/server/app/api/conversations/route.js.nft.json +1 -1
  51. package/.next/server/app/api/decisions/route.js +1 -1
  52. package/.next/server/app/api/decisions/route.js.nft.json +1 -1
  53. package/.next/server/app/api/docs/route.js +1 -1
  54. package/.next/server/app/api/docs/route.js.nft.json +1 -1
  55. package/.next/server/app/api/explorer/route.js +1 -1
  56. package/.next/server/app/api/explorer/route.js.nft.json +1 -1
  57. package/.next/server/app/api/mcp/route.js +1 -1
  58. package/.next/server/app/api/mcp/route.js.nft.json +1 -1
  59. package/.next/server/app/api/memory/entries/delete/route.js +1 -1
  60. package/.next/server/app/api/memory/entries/delete/route.js.nft.json +1 -1
  61. package/.next/server/app/api/memory/entries/restore/route.js +1 -1
  62. package/.next/server/app/api/memory/entries/restore/route.js.nft.json +1 -1
  63. package/.next/server/app/api/memory/entries/route.js +1 -1
  64. package/.next/server/app/api/memory/entries/route.js.nft.json +1 -1
  65. package/.next/server/app/api/memory/entries/save/route.js +1 -1
  66. package/.next/server/app/api/memory/entries/save/route.js.nft.json +1 -1
  67. package/.next/server/app/api/memory/graph/route.js +1 -1
  68. package/.next/server/app/api/memory/graph/route.js.nft.json +1 -1
  69. package/.next/server/app/api/memory/history/route.js +1 -1
  70. package/.next/server/app/api/memory/history/route.js.nft.json +1 -1
  71. package/.next/server/app/api/memory/route.js +1 -1
  72. package/.next/server/app/api/memory/route.js.nft.json +1 -1
  73. package/.next/server/app/api/plan/apply/route.js +1 -1
  74. package/.next/server/app/api/plan/apply/route.js.nft.json +1 -1
  75. package/.next/server/app/api/projects/route.js +1 -1
  76. package/.next/server/app/api/projects/route.js.nft.json +1 -1
  77. package/.next/server/app/api/registry/route.js +1 -1
  78. package/.next/server/app/api/registry/route.js.nft.json +1 -1
  79. package/.next/server/app/api/roadmap/create/route.js +1 -1
  80. package/.next/server/app/api/roadmap/create/route.js.nft.json +1 -1
  81. package/.next/server/app/api/roadmap/delete/route.js +1 -1
  82. package/.next/server/app/api/roadmap/delete/route.js.nft.json +1 -1
  83. package/.next/server/app/api/roadmap/generate/route.js +1 -1
  84. package/.next/server/app/api/roadmap/generate/route.js.nft.json +1 -1
  85. package/.next/server/app/api/roadmap/layout/route.js +1 -1
  86. package/.next/server/app/api/roadmap/layout/route.js.nft.json +1 -1
  87. package/.next/server/app/api/roadmap/restore/route.js +1 -1
  88. package/.next/server/app/api/roadmap/restore/route.js.nft.json +1 -1
  89. package/.next/server/app/api/roadmap/route.js +1 -1
  90. package/.next/server/app/api/roadmap/route.js.nft.json +1 -1
  91. package/.next/server/app/api/roadmap/update/route.js +1 -1
  92. package/.next/server/app/api/roadmap/update/route.js.nft.json +1 -1
  93. package/.next/server/app/api/sessions/route.js +1 -1
  94. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  95. package/.next/server/app/api/settings/route.js +1 -1
  96. package/.next/server/app/api/settings/route.js.nft.json +1 -1
  97. package/.next/server/app/api/setup/generate/route.js +1 -1
  98. package/.next/server/app/api/setup/generate/route.js.nft.json +1 -1
  99. package/.next/server/app/api/setup/write/route.js +1 -1
  100. package/.next/server/app/api/setup/write/route.js.nft.json +1 -1
  101. package/.next/server/app/api/summary/route.js +1 -1
  102. package/.next/server/app/api/summary/route.js.nft.json +1 -1
  103. package/.next/server/app/api/tasks/bulk/route.js +1 -1
  104. package/.next/server/app/api/tasks/bulk/route.js.nft.json +1 -1
  105. package/.next/server/app/api/tasks/create/route.js +1 -1
  106. package/.next/server/app/api/tasks/create/route.js.nft.json +1 -1
  107. package/.next/server/app/api/tasks/delete/route.js +1 -1
  108. package/.next/server/app/api/tasks/delete/route.js.nft.json +1 -1
  109. package/.next/server/app/api/tasks/manual-tests/route.js +1 -1
  110. package/.next/server/app/api/tasks/manual-tests/route.js.nft.json +1 -1
  111. package/.next/server/app/api/tasks/restore/route.js +1 -1
  112. package/.next/server/app/api/tasks/restore/route.js.nft.json +1 -1
  113. package/.next/server/app/api/tasks/review/route.js +1 -1
  114. package/.next/server/app/api/tasks/review/route.js.nft.json +1 -1
  115. package/.next/server/app/api/tasks/route.js +1 -1
  116. package/.next/server/app/api/tasks/route.js.nft.json +1 -1
  117. package/.next/server/app/api/tasks/update/route.js +1 -1
  118. package/.next/server/app/api/tasks/update/route.js.nft.json +1 -1
  119. package/.next/server/app/api/views/route.js +1 -1
  120. package/.next/server/app/api/views/route.js.nft.json +1 -1
  121. package/.next/server/app/board.html +1 -1
  122. package/.next/server/app/board.rsc +23 -22
  123. package/.next/server/app/board.segments/!KGFwcCk/board/__PAGE__.segment.rsc +6 -6
  124. package/.next/server/app/board.segments/_full.segment.rsc +23 -22
  125. package/.next/server/app/board.segments/_tree.segment.rsc +2 -2
  126. package/.next/server/app/chat.html +1 -1
  127. package/.next/server/app/chat.rsc +23 -22
  128. package/.next/server/app/chat.segments/!KGFwcCk/chat/__PAGE__.segment.rsc +11 -9
  129. package/.next/server/app/chat.segments/_full.segment.rsc +23 -22
  130. package/.next/server/app/chat.segments/_tree.segment.rsc +2 -2
  131. package/.next/server/app/docs.html +1 -1
  132. package/.next/server/app/docs.rsc +23 -22
  133. package/.next/server/app/docs.segments/!KGFwcCk/docs/__PAGE__.segment.rsc +6 -6
  134. package/.next/server/app/docs.segments/_full.segment.rsc +23 -22
  135. package/.next/server/app/docs.segments/_tree.segment.rsc +2 -2
  136. package/.next/server/app/explorer.html +1 -1
  137. package/.next/server/app/explorer.rsc +23 -22
  138. package/.next/server/app/explorer.segments/!KGFwcCk/explorer/__PAGE__.segment.rsc +5 -5
  139. package/.next/server/app/explorer.segments/_full.segment.rsc +23 -22
  140. package/.next/server/app/explorer.segments/_tree.segment.rsc +2 -2
  141. package/.next/server/app/index.html +1 -1
  142. package/.next/server/app/index.rsc +2 -2
  143. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  144. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  145. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  146. package/.next/server/app/manual-tests.html +1 -1
  147. package/.next/server/app/manual-tests.rsc +23 -22
  148. package/.next/server/app/manual-tests.segments/!KGFwcCk/manual-tests/__PAGE__.segment.rsc +5 -5
  149. package/.next/server/app/manual-tests.segments/_full.segment.rsc +23 -22
  150. package/.next/server/app/manual-tests.segments/_tree.segment.rsc +2 -2
  151. package/.next/server/app/memory.html +1 -1
  152. package/.next/server/app/memory.rsc +23 -22
  153. package/.next/server/app/memory.segments/!KGFwcCk/memory/__PAGE__.segment.rsc +9 -11
  154. package/.next/server/app/memory.segments/_full.segment.rsc +23 -22
  155. package/.next/server/app/memory.segments/_tree.segment.rsc +2 -2
  156. package/.next/server/app/page.js.nft.json +1 -1
  157. package/.next/server/app/page_client-reference-manifest.js +1 -1
  158. package/.next/server/app/roadmap.html +1 -1
  159. package/.next/server/app/roadmap.rsc +23 -22
  160. package/.next/server/app/roadmap.segments/!KGFwcCk/roadmap/__PAGE__.segment.rsc +6 -6
  161. package/.next/server/app/roadmap.segments/_full.segment.rsc +23 -22
  162. package/.next/server/app/roadmap.segments/_tree.segment.rsc +2 -2
  163. package/.next/server/app/settings.html +1 -1
  164. package/.next/server/app/settings.rsc +23 -22
  165. package/.next/server/app/settings.segments/!KGFwcCk/settings/__PAGE__.segment.rsc +9 -10
  166. package/.next/server/app/settings.segments/_full.segment.rsc +23 -22
  167. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  168. package/.next/server/app/setup.html +1 -1
  169. package/.next/server/app/setup.rsc +23 -22
  170. package/.next/server/app/setup.segments/!KGFwcCk/setup/__PAGE__.segment.rsc +5 -5
  171. package/.next/server/app/setup.segments/_full.segment.rsc +23 -22
  172. package/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
  173. package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0-_cqh8._.js → 11mp_@anthropic-ai_sdk_053zt3c._.js} +1 -1
  174. package/.next/server/chunks/{11mp_@anthropic-ai_sdk_03cp17a._.js → 11mp_@anthropic-ai_sdk_0_zx69c._.js} +1 -1
  175. package/.next/server/chunks/{11mp_@anthropic-ai_sdk_00o5o78._.js → 11mp_@anthropic-ai_sdk_0gvxfg3._.js} +1 -1
  176. package/.next/server/chunks/{11mp_@anthropic-ai_sdk_07dk2er._.js → 11mp_@anthropic-ai_sdk_0gx5t2l._.js} +1 -1
  177. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0krkw4y._.js +3 -0
  178. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0l0xzie._.js +3 -0
  179. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0pgjvhr._.js +3 -0
  180. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0r-keh6._.js +3 -0
  181. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0tvfbjt._.js +3 -0
  182. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0u4b8_f._.js +3 -0
  183. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0ud37xh._.js +3 -0
  184. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0v3ar-t._.js +3 -0
  185. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0wk0b65._.js +3 -0
  186. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0wqkd2r._.js +3 -0
  187. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0wypotx._.js +3 -0
  188. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0yuq-9s._.js +3 -0
  189. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0z-e57x._.js +3 -0
  190. package/.next/server/chunks/11mp_@anthropic-ai_sdk_108ltz4._.js +3 -0
  191. package/.next/server/chunks/11mp_@anthropic-ai_sdk_10c_i6_._.js +3 -0
  192. package/.next/server/chunks/11mp_@anthropic-ai_sdk_14jogs8._.js +3 -0
  193. package/.next/server/chunks/11mp_@anthropic-ai_sdk_15u-n39._.js +3 -0
  194. package/.next/server/chunks/11mp_@anthropic-ai_sdk_194ahxu._.js +3 -0
  195. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1ahph2t._.js +3 -0
  196. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1ajy77y._.js +3 -0
  197. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1b57s9p._.js +3 -0
  198. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1brf2xn._.js +3 -0
  199. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1btfw2x._.js +3 -0
  200. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1cyy_q6._.js +3 -0
  201. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1fz9fev._.js +3 -0
  202. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1i_rz7h._.js +3 -0
  203. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1it8zsv._.js +3 -0
  204. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1jzusvd._.js +3 -0
  205. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1lfknr2._.js +3 -0
  206. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1mewd-3._.js +3 -0
  207. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1mkm4u_._.js +3 -0
  208. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1rggqq3._.js +3 -0
  209. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1rhjf1m._.js +3 -0
  210. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1s6ks8c._.js +3 -0
  211. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1u8z4hp._.js +3 -0
  212. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1vyy3_4._.js +3 -0
  213. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_036bvwf._.js +3 -0
  214. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_046taqd._.js +3 -0
  215. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0bxad5f._.js +3 -0
  216. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0g65abt._.js +3 -0
  217. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0pb9bu1._.js +3 -0
  218. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_120-cio._.js +3 -0
  219. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_13uyu_v._.js +3 -0
  220. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_13x2ww0._.js +3 -0
  221. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_17og64d._.js +3 -0
  222. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1e_sh4o._.js +3 -0
  223. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1ecuo9i._.js +3 -0
  224. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1go8d0m._.js +3 -0
  225. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1i13ryx._.js +3 -0
  226. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1jv_hid._.js +3 -0
  227. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1mh5mqk._.js +3 -0
  228. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1oq7e8u._.js +3 -0
  229. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1p-cq-p._.js +3 -0
  230. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1the3g0._.js +3 -0
  231. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1xubh-w._.js +3 -0
  232. package/.next/server/chunks/{[root-of-the-server]__0hfyuhq._.js → [root-of-the-server]__00o3mbd._.js} +2 -2
  233. package/.next/server/chunks/{[root-of-the-server]__0y5usoz._.js → [root-of-the-server]__01n_hoh._.js} +2 -2
  234. package/.next/server/chunks/{[root-of-the-server]__08yaps5._.js → [root-of-the-server]__05tx02j._.js} +2 -2
  235. package/.next/server/chunks/{[root-of-the-server]__0b2488c._.js → [root-of-the-server]__06dfvb0._.js} +2 -2
  236. package/.next/server/chunks/{[root-of-the-server]__1tu85zx._.js → [root-of-the-server]__06z8i6e._.js} +2 -2
  237. package/.next/server/chunks/{[root-of-the-server]__0qij7wy._.js → [root-of-the-server]__076d4xm._.js} +2 -2
  238. package/.next/server/chunks/{[root-of-the-server]__1z3tswg._.js → [root-of-the-server]__09j_-hj._.js} +2 -2
  239. package/.next/server/chunks/[root-of-the-server]__0jr_5eq._.js +11 -11
  240. package/.next/server/chunks/[root-of-the-server]__0jr_5eq._.js.map +1 -1
  241. package/.next/server/chunks/{[root-of-the-server]__1gvv2xp._.js → [root-of-the-server]__0kuhhna._.js} +2 -2
  242. package/.next/server/chunks/{[root-of-the-server]__008focd._.js → [root-of-the-server]__0p4w_o-._.js} +2 -2
  243. package/.next/server/chunks/{[root-of-the-server]__1ssunti._.js → [root-of-the-server]__0uu9pgg._.js} +2 -2
  244. package/.next/server/chunks/{[root-of-the-server]__1b448u7._.js → [root-of-the-server]__1-1hfrj._.js} +2 -2
  245. package/.next/server/chunks/{[root-of-the-server]__0ikbk15._.js → [root-of-the-server]__15jhpgl._.js} +2 -2
  246. package/.next/server/chunks/[root-of-the-server]__19rxcu4._.js +11 -11
  247. package/.next/server/chunks/[root-of-the-server]__19rxcu4._.js.map +1 -1
  248. package/.next/server/chunks/{[root-of-the-server]__0m8hmg0._.js → [root-of-the-server]__19w-7h9._.js} +2 -2
  249. package/.next/server/chunks/{[root-of-the-server]__01xmabe._.js → [root-of-the-server]__1af-wfk._.js} +2 -2
  250. package/.next/server/chunks/{[root-of-the-server]__0cbh1s-._.js → [root-of-the-server]__1e_o8h4._.js} +2 -2
  251. package/.next/server/chunks/{[root-of-the-server]__16u25oa._.js → [root-of-the-server]__1gr4e22._.js} +2 -2
  252. package/.next/server/chunks/{[root-of-the-server]__1jz98vb._.js → [root-of-the-server]__1h5hb6u._.js} +2 -2
  253. package/.next/server/chunks/{[root-of-the-server]__1xpp36t._.js → [root-of-the-server]__1kw2vct._.js} +2 -2
  254. package/.next/server/chunks/{[root-of-the-server]__0axugex._.js → [root-of-the-server]__1lt5cds._.js} +2 -2
  255. package/.next/server/chunks/[root-of-the-server]__1qd-ecl._.js +11 -11
  256. package/.next/server/chunks/[root-of-the-server]__1qd-ecl._.js.map +1 -1
  257. package/.next/server/chunks/{[root-of-the-server]__03ogp2r._.js → [root-of-the-server]__1rjgpbm._.js} +2 -2
  258. package/.next/server/chunks/{[root-of-the-server]__0x8wtot._.js → [root-of-the-server]__1spley9._.js} +2 -2
  259. package/.next/server/chunks/_04byth9._.js +25 -25
  260. package/.next/server/chunks/_04byth9._.js.map +1 -1
  261. package/.next/server/chunks/_1au4syj._.js +1 -1
  262. package/.next/server/chunks/_1au4syj._.js.map +1 -1
  263. package/.next/server/chunks/ssr/{0_nd_mermaid_dist_mermaid_core_mjs_027n2yl._.js → 0_nd_mermaid_dist_mermaid_core_mjs_0itmgkm._.js} +2 -2
  264. package/.next/server/chunks/ssr/{1u84_katex_dist_katex_mjs_1kb5xea._.js → 1u84_katex_dist_katex_mjs_08jn-sj._.js} +1 -1
  265. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_1tcci-3._.js +3 -0
  266. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_1tcci-3._.js.map +1 -0
  267. package/.next/server/chunks/ssr/{1x05_lucide-react_dist_esm_icons_14hl50o._.js → 1x05_lucide-react_dist_esm_icons_1uybmua._.js} +2 -2
  268. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_1uybmua._.js.map +1 -0
  269. package/.next/server/chunks/ssr/_04xff_2._.js +1 -1
  270. package/.next/server/chunks/ssr/_04xff_2._.js.map +1 -1
  271. package/.next/server/chunks/ssr/_0h91h9n._.js +3 -0
  272. package/.next/server/chunks/ssr/_0h91h9n._.js.map +1 -0
  273. package/.next/server/chunks/ssr/_0idb-vo._.js.map +1 -1
  274. package/.next/server/chunks/ssr/_0ip7sg0._.js +3 -0
  275. package/.next/server/chunks/ssr/_0ip7sg0._.js.map +1 -0
  276. package/.next/server/chunks/ssr/_0ks_bep._.js +3 -0
  277. package/.next/server/chunks/ssr/_0ks_bep._.js.map +1 -0
  278. package/.next/server/chunks/ssr/{_1ocnpth._.js → _0lqrpim._.js} +2 -2
  279. package/.next/server/chunks/ssr/_0lqrpim._.js.map +1 -0
  280. package/.next/server/chunks/ssr/_0qp3gu7._.js +1 -1
  281. package/.next/server/chunks/ssr/_0qp3gu7._.js.map +1 -1
  282. package/.next/server/chunks/ssr/_0rmo9r-._.js +4 -0
  283. package/.next/server/chunks/ssr/_0rmo9r-._.js.map +1 -0
  284. package/.next/server/chunks/ssr/_0ust7tw._.js +4 -0
  285. package/.next/server/chunks/ssr/_0ust7tw._.js.map +1 -0
  286. package/.next/server/chunks/ssr/_197jl3g._.js +3 -0
  287. package/.next/server/chunks/ssr/_197jl3g._.js.map +1 -0
  288. package/.next/server/chunks/ssr/{src_components_docs_MarkdownRenderer_tsx_1kshaz1._.js → _19k2iz0._.js} +21 -21
  289. package/.next/server/chunks/ssr/_19k2iz0._.js.map +1 -0
  290. package/.next/server/chunks/ssr/_1el478k._.js +3 -0
  291. package/.next/server/chunks/ssr/_1el478k._.js.map +1 -0
  292. package/.next/server/chunks/ssr/_1s2ya35._.js +3 -0
  293. package/.next/server/chunks/ssr/_1t76zdx._.js +1 -1
  294. package/.next/server/chunks/ssr/_1t76zdx._.js.map +1 -1
  295. package/.next/server/chunks/ssr/{node_modules__pnpm_1qp_jvj._.js → node_modules__pnpm_00lsytc._.js} +2 -2
  296. package/.next/server/chunks/ssr/{node_modules__pnpm_1ygal0c._.js → node_modules__pnpm_02p2rqs._.js} +1 -1
  297. package/.next/server/chunks/ssr/{node_modules__pnpm_1-76qxg._.js → node_modules__pnpm_05-p8zy._.js} +1 -1
  298. package/.next/server/chunks/ssr/{node_modules__pnpm_1qmkxyo._.js → node_modules__pnpm_060kz-j._.js} +1 -1
  299. package/.next/server/chunks/ssr/{node_modules__pnpm_0ctisl0._.js → node_modules__pnpm_0_83tv8._.js} +1 -1
  300. package/.next/server/chunks/ssr/{node_modules__pnpm_0ycbjbd._.js → node_modules__pnpm_0_ajzll._.js} +2 -2
  301. package/.next/server/chunks/ssr/{node_modules__pnpm_0kpu0-2._.js → node_modules__pnpm_0abf_e9._.js} +1 -1
  302. package/.next/server/chunks/ssr/{node_modules__pnpm_0fwp8jm._.js → node_modules__pnpm_0e55e7-._.js} +1 -1
  303. package/.next/server/chunks/ssr/{node_modules__pnpm_1q_hhr3._.js → node_modules__pnpm_0eub17j._.js} +2 -2
  304. package/.next/server/chunks/ssr/{node_modules__pnpm_1-r94f7._.js → node_modules__pnpm_0gp90ei._.js} +1 -1
  305. package/.next/server/chunks/ssr/{node_modules__pnpm_16u1vfb._.js → node_modules__pnpm_0iqb0_x._.js} +2 -2
  306. package/.next/server/chunks/ssr/{node_modules__pnpm_1uwkcin._.js → node_modules__pnpm_0j7asqf._.js} +1 -1
  307. package/.next/server/chunks/ssr/{node_modules__pnpm_1f440kx._.js → node_modules__pnpm_0jlzk5z._.js} +1 -1
  308. package/.next/server/chunks/ssr/{node_modules__pnpm_14piqi4._.js → node_modules__pnpm_0rsfj9v._.js} +1 -1
  309. package/.next/server/chunks/ssr/{node_modules__pnpm_01bjcv9._.js → node_modules__pnpm_0s63lee._.js} +1 -1
  310. package/.next/server/chunks/ssr/{node_modules__pnpm_189m48n._.js → node_modules__pnpm_0s7j-tv._.js} +1 -1
  311. package/.next/server/chunks/ssr/{node_modules__pnpm_1ssjj4u._.js → node_modules__pnpm_0up4z7m._.js} +1 -1
  312. package/.next/server/chunks/ssr/{node_modules__pnpm_06d-fdo._.js → node_modules__pnpm_0v_mhl7._.js} +2 -2
  313. package/.next/server/chunks/ssr/{node_modules__pnpm_1a48_nl._.js → node_modules__pnpm_0vuao3_._.js} +1 -1
  314. package/.next/server/chunks/ssr/{node_modules__pnpm_0vry74x._.js → node_modules__pnpm_14j18h7._.js} +2 -2
  315. package/.next/server/chunks/ssr/{node_modules__pnpm_17i6z2d._.js → node_modules__pnpm_16bj927._.js} +1 -1
  316. package/.next/server/chunks/ssr/{node_modules__pnpm_192f222._.js → node_modules__pnpm_1ch46nl._.js} +1 -1
  317. package/.next/server/chunks/ssr/{node_modules__pnpm_1txccoj._.js → node_modules__pnpm_1dc-yxd._.js} +1 -1
  318. package/.next/server/chunks/ssr/{node_modules__pnpm_1min2jl._.js → node_modules__pnpm_1fry8_2._.js} +1 -1
  319. package/.next/server/chunks/ssr/{node_modules__pnpm_1fn3ejy._.js → node_modules__pnpm_1gpkxns._.js} +1 -1
  320. package/.next/server/chunks/ssr/{node_modules__pnpm_1aa37e1._.js → node_modules__pnpm_1hqh95z._.js} +1 -1
  321. package/.next/server/chunks/ssr/{node_modules__pnpm_03qrzdb._.js → node_modules__pnpm_1oaf50x._.js} +1 -1
  322. package/.next/server/chunks/ssr/src_app_(app)_board_page_tsx_0gpfc77._.js +1 -1
  323. package/.next/server/chunks/ssr/src_app_(app)_board_page_tsx_0gpfc77._.js.map +1 -1
  324. package/.next/server/chunks/ssr/src_app_(app)_layout_tsx_1yu5hom._.js +1 -1
  325. package/.next/server/chunks/ssr/src_app_(app)_layout_tsx_1yu5hom._.js.map +1 -1
  326. package/.next/server/chunks/ssr/src_app_(app)_memory_page_tsx_19jhb1c._.js +2 -2
  327. package/.next/server/chunks/ssr/src_app_(app)_memory_page_tsx_19jhb1c._.js.map +1 -1
  328. package/.next/server/chunks/ssr/src_app_(app)_roadmap_page_tsx_0vcq3jr._.js +2 -2
  329. package/.next/server/chunks/ssr/src_app_(app)_roadmap_page_tsx_0vcq3jr._.js.map +1 -1
  330. package/.next/server/chunks/ssr/src_app_(app)_settings_page_tsx_0zevtee._.js +2 -2
  331. package/.next/server/chunks/ssr/src_app_(app)_settings_page_tsx_0zevtee._.js.map +1 -1
  332. package/.next/server/chunks/ssr/src_app_(app)_setup_page_tsx_1yids_n._.js +1 -1
  333. package/.next/server/chunks/ssr/src_app_(app)_setup_page_tsx_1yids_n._.js.map +1 -1
  334. package/.next/server/chunks/ssr/src_components_0eyr_zi._.js +1 -1
  335. package/.next/server/chunks/ssr/src_components_0eyr_zi._.js.map +1 -1
  336. package/.next/server/chunks/ssr/src_components_1s861m8._.js +1 -1
  337. package/.next/server/chunks/ssr/src_components_1s861m8._.js.map +1 -1
  338. package/.next/server/chunks/ssr/src_components_docs_editor-theme_ts_0ji4rd5._.js +3 -0
  339. package/.next/server/chunks/ssr/src_components_docs_editor-theme_ts_0ji4rd5._.js.map +1 -0
  340. package/.next/server/middleware-build-manifest.js +3 -3
  341. package/.next/server/pages/404.html +1 -1
  342. package/.next/server/pages/500.html +1 -1
  343. package/.next/server/server-reference-manifest.js +1 -1
  344. package/.next/server/server-reference-manifest.json +1 -1
  345. package/.next/static/chunks/05qw7-fs1exlt.js +1 -0
  346. package/.next/static/chunks/{16k196zyl-n9q.js → 08sqjdq-43nbt.js} +1 -1
  347. package/.next/static/chunks/09r4_4wr0aga3.js +1 -0
  348. package/.next/static/chunks/0xw_sa58zqv5s.js +1 -0
  349. package/.next/static/chunks/{3ruw8lu2_re-h.js → 1-a3-6c_nce84.js} +1 -1
  350. package/.next/static/chunks/13cz-8lvre7gj.js +1 -0
  351. package/.next/static/chunks/149fj-mseo8q3.css +1 -0
  352. package/.next/static/chunks/1c11k-snzp541.js +1 -0
  353. package/.next/static/chunks/1c459q7xpgq6r.js +3 -0
  354. package/.next/static/chunks/1hh2cxd9ndxf-.js +68 -0
  355. package/.next/static/chunks/1huu1nljqois-.js +1 -0
  356. package/.next/static/chunks/{1l_dys0-y5-r7.js → 1n4_u3om7ye4z.js} +1 -1
  357. package/.next/static/chunks/1qhndyi2gdbkf.js +1 -0
  358. package/.next/static/chunks/1s64z5c36fv-4.js +21 -0
  359. package/.next/static/chunks/1x40-5s54wd5m.js +11 -0
  360. package/.next/static/chunks/2-0lpccy0f8bk.js +2 -0
  361. package/.next/static/chunks/2x6eh3w-u8lk4.js +1 -0
  362. package/.next/static/chunks/30s090l71e1gs.js +1 -0
  363. package/.next/static/chunks/37u2gjz5dzhep.js +1 -0
  364. package/.next/static/chunks/3t8px4aygy1s9.js +1 -0
  365. package/.next/static/chunks/{0b547y6rqct9z.js → 44gr_v5092gwh.js} +1 -1
  366. package/package.json +3 -2
  367. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0_e9zpr._.js +0 -3
  368. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0_xx_qf._.js +0 -3
  369. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0aer9lc._.js +0 -3
  370. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0ax30pe._.js +0 -3
  371. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0gn7vgs._.js +0 -3
  372. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0hye94a._.js +0 -3
  373. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0ir5cgk._.js +0 -3
  374. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0je0_pa._.js +0 -3
  375. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0jfgh0o._.js +0 -3
  376. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0mha4x1._.js +0 -3
  377. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0n__boa._.js +0 -3
  378. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0sqv26_._.js +0 -3
  379. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0wnc6g-._.js +0 -3
  380. package/.next/server/chunks/11mp_@anthropic-ai_sdk_0xh0g59._.js +0 -3
  381. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1-5wyhj._.js +0 -3
  382. package/.next/server/chunks/11mp_@anthropic-ai_sdk_13ahm3n._.js +0 -3
  383. package/.next/server/chunks/11mp_@anthropic-ai_sdk_13e6aq4._.js +0 -3
  384. package/.next/server/chunks/11mp_@anthropic-ai_sdk_14eg0ld._.js +0 -3
  385. package/.next/server/chunks/11mp_@anthropic-ai_sdk_15md1n2._.js +0 -3
  386. package/.next/server/chunks/11mp_@anthropic-ai_sdk_16av8b9._.js +0 -3
  387. package/.next/server/chunks/11mp_@anthropic-ai_sdk_16hjhv1._.js +0 -3
  388. package/.next/server/chunks/11mp_@anthropic-ai_sdk_16txvf7._.js +0 -3
  389. package/.next/server/chunks/11mp_@anthropic-ai_sdk_198yu7d._.js +0 -3
  390. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1_9tfq3._.js +0 -3
  391. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1_izr2o._.js +0 -3
  392. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1fljcyg._.js +0 -3
  393. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1lrt6ul._.js +0 -3
  394. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1nev_ee._.js +0 -3
  395. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1pgoe2i._.js +0 -3
  396. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1rgl7mu._.js +0 -3
  397. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1slq49k._.js +0 -3
  398. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1t9bdf0._.js +0 -3
  399. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1u6qqm2._.js +0 -3
  400. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1v7ygvz._.js +0 -3
  401. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1wls8zc._.js +0 -3
  402. package/.next/server/chunks/11mp_@anthropic-ai_sdk_1ywboja._.js +0 -3
  403. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_00kwqu5._.js +0 -3
  404. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_01j2nrd._.js +0 -3
  405. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_05ybj3t._.js +0 -3
  406. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0adt7jj._.js +0 -3
  407. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0bnl14w._.js +0 -3
  408. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0f557t9._.js +0 -3
  409. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_0ra6giw._.js +0 -3
  410. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_107cqfx._.js +0 -3
  411. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1377sl6._.js +0 -3
  412. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1_2hcok._.js +0 -3
  413. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1g--m6y._.js +0 -3
  414. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1geopi5._.js +0 -3
  415. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1i11dte._.js +0 -3
  416. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1mj3_qk._.js +0 -3
  417. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1qgy210._.js +0 -3
  418. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1rkng9q._.js +0 -3
  419. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1vr8q8y._.js +0 -3
  420. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1x8b64g._.js +0 -3
  421. package/.next/server/chunks/11mp_@anthropic-ai_sdk_index_mjs_1zhahf7._.js +0 -3
  422. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0wurouw._.js +0 -3
  423. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_0wurouw._.js.map +0 -1
  424. package/.next/server/chunks/ssr/1x05_lucide-react_dist_esm_icons_14hl50o._.js.map +0 -1
  425. package/.next/server/chunks/ssr/_071j6mr._.js +0 -4
  426. package/.next/server/chunks/ssr/_071j6mr._.js.map +0 -1
  427. package/.next/server/chunks/ssr/_0i75x-o._.js +0 -3
  428. package/.next/server/chunks/ssr/_0i75x-o._.js.map +0 -1
  429. package/.next/server/chunks/ssr/_15qpb4z._.js +0 -3
  430. package/.next/server/chunks/ssr/_15qpb4z._.js.map +0 -1
  431. package/.next/server/chunks/ssr/_1fg0usp._.js +0 -3
  432. package/.next/server/chunks/ssr/_1fg0usp._.js.map +0 -1
  433. package/.next/server/chunks/ssr/_1h0wfpz._.js +0 -3
  434. package/.next/server/chunks/ssr/_1h0wfpz._.js.map +0 -1
  435. package/.next/server/chunks/ssr/_1ncdakv._.js +0 -4
  436. package/.next/server/chunks/ssr/_1ncdakv._.js.map +0 -1
  437. package/.next/server/chunks/ssr/_1ocnpth._.js.map +0 -1
  438. package/.next/server/chunks/ssr/_1uno162._.js +0 -3
  439. package/.next/server/chunks/ssr/_1uno162._.js.map +0 -1
  440. package/.next/server/chunks/ssr/node_modules__pnpm_1xeothw._.js +0 -3
  441. package/.next/server/chunks/ssr/src_components_docs_MarkdownRenderer_tsx_1kshaz1._.js.map +0 -1
  442. package/.next/static/chunks/02cj5_i9np4sg.js +0 -3
  443. package/.next/static/chunks/0e3ha56i_0j05.css +0 -1
  444. package/.next/static/chunks/0f32hudp0yir7.js +0 -2
  445. package/.next/static/chunks/0rsmz1jgro1kj.js +0 -1
  446. package/.next/static/chunks/0wnq_kh8-6wc1.js +0 -2
  447. package/.next/static/chunks/13l4l-boqg8fx.js +0 -1
  448. package/.next/static/chunks/14hxe1qiaram9.js +0 -1
  449. package/.next/static/chunks/18b5l8p0vd9f8.js +0 -1
  450. package/.next/static/chunks/1acpfyut6j4e2.js +0 -1
  451. package/.next/static/chunks/1rko_88i85yqb.js +0 -21
  452. package/.next/static/chunks/1tu8lforstp1o.js +0 -1
  453. package/.next/static/chunks/20mdcup14_0yi.js +0 -11
  454. package/.next/static/chunks/23-xknrz6o748.js +0 -1
  455. package/.next/static/chunks/2p-pkveutoh75.js +0 -1
  456. package/.next/static/chunks/329sozud9-tvr.js +0 -1
  457. package/.next/static/chunks/3qqvn9vv6i0gy.js +0 -68
  458. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0-_cqh8._.js.map → 11mp_@anthropic-ai_sdk_053zt3c._.js.map} +0 -0
  459. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_00o5o78._.js.map → 11mp_@anthropic-ai_sdk_0_zx69c._.js.map} +0 -0
  460. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_03cp17a._.js.map → 11mp_@anthropic-ai_sdk_0gvxfg3._.js.map} +0 -0
  461. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_07dk2er._.js.map → 11mp_@anthropic-ai_sdk_0gx5t2l._.js.map} +0 -0
  462. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0_e9zpr._.js.map → 11mp_@anthropic-ai_sdk_0krkw4y._.js.map} +0 -0
  463. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0_xx_qf._.js.map → 11mp_@anthropic-ai_sdk_0l0xzie._.js.map} +0 -0
  464. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0aer9lc._.js.map → 11mp_@anthropic-ai_sdk_0pgjvhr._.js.map} +0 -0
  465. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0ax30pe._.js.map → 11mp_@anthropic-ai_sdk_0r-keh6._.js.map} +0 -0
  466. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0gn7vgs._.js.map → 11mp_@anthropic-ai_sdk_0tvfbjt._.js.map} +0 -0
  467. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0hye94a._.js.map → 11mp_@anthropic-ai_sdk_0u4b8_f._.js.map} +0 -0
  468. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0ir5cgk._.js.map → 11mp_@anthropic-ai_sdk_0ud37xh._.js.map} +0 -0
  469. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0je0_pa._.js.map → 11mp_@anthropic-ai_sdk_0v3ar-t._.js.map} +0 -0
  470. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0jfgh0o._.js.map → 11mp_@anthropic-ai_sdk_0wk0b65._.js.map} +0 -0
  471. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0mha4x1._.js.map → 11mp_@anthropic-ai_sdk_0wqkd2r._.js.map} +0 -0
  472. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0n__boa._.js.map → 11mp_@anthropic-ai_sdk_0wypotx._.js.map} +0 -0
  473. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0sqv26_._.js.map → 11mp_@anthropic-ai_sdk_0yuq-9s._.js.map} +0 -0
  474. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0wnc6g-._.js.map → 11mp_@anthropic-ai_sdk_0z-e57x._.js.map} +0 -0
  475. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_0xh0g59._.js.map → 11mp_@anthropic-ai_sdk_108ltz4._.js.map} +0 -0
  476. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1-5wyhj._.js.map → 11mp_@anthropic-ai_sdk_10c_i6_._.js.map} +0 -0
  477. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_13ahm3n._.js.map → 11mp_@anthropic-ai_sdk_14jogs8._.js.map} +0 -0
  478. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_13e6aq4._.js.map → 11mp_@anthropic-ai_sdk_15u-n39._.js.map} +0 -0
  479. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_14eg0ld._.js.map → 11mp_@anthropic-ai_sdk_194ahxu._.js.map} +0 -0
  480. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_15md1n2._.js.map → 11mp_@anthropic-ai_sdk_1ahph2t._.js.map} +0 -0
  481. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_16av8b9._.js.map → 11mp_@anthropic-ai_sdk_1ajy77y._.js.map} +0 -0
  482. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_16hjhv1._.js.map → 11mp_@anthropic-ai_sdk_1b57s9p._.js.map} +0 -0
  483. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_16txvf7._.js.map → 11mp_@anthropic-ai_sdk_1brf2xn._.js.map} +0 -0
  484. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_198yu7d._.js.map → 11mp_@anthropic-ai_sdk_1btfw2x._.js.map} +0 -0
  485. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1_9tfq3._.js.map → 11mp_@anthropic-ai_sdk_1cyy_q6._.js.map} +0 -0
  486. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1_izr2o._.js.map → 11mp_@anthropic-ai_sdk_1fz9fev._.js.map} +0 -0
  487. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1fljcyg._.js.map → 11mp_@anthropic-ai_sdk_1i_rz7h._.js.map} +0 -0
  488. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1lrt6ul._.js.map → 11mp_@anthropic-ai_sdk_1it8zsv._.js.map} +0 -0
  489. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1nev_ee._.js.map → 11mp_@anthropic-ai_sdk_1jzusvd._.js.map} +0 -0
  490. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1pgoe2i._.js.map → 11mp_@anthropic-ai_sdk_1lfknr2._.js.map} +0 -0
  491. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1rgl7mu._.js.map → 11mp_@anthropic-ai_sdk_1mewd-3._.js.map} +0 -0
  492. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1slq49k._.js.map → 11mp_@anthropic-ai_sdk_1mkm4u_._.js.map} +0 -0
  493. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1t9bdf0._.js.map → 11mp_@anthropic-ai_sdk_1rggqq3._.js.map} +0 -0
  494. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1u6qqm2._.js.map → 11mp_@anthropic-ai_sdk_1rhjf1m._.js.map} +0 -0
  495. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1v7ygvz._.js.map → 11mp_@anthropic-ai_sdk_1s6ks8c._.js.map} +0 -0
  496. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1wls8zc._.js.map → 11mp_@anthropic-ai_sdk_1u8z4hp._.js.map} +0 -0
  497. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_1ywboja._.js.map → 11mp_@anthropic-ai_sdk_1vyy3_4._.js.map} +0 -0
  498. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_00kwqu5._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_036bvwf._.js.map} +0 -0
  499. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_01j2nrd._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_046taqd._.js.map} +0 -0
  500. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_05ybj3t._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0bxad5f._.js.map} +0 -0
  501. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0adt7jj._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0g65abt._.js.map} +0 -0
  502. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0bnl14w._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_0pb9bu1._.js.map} +0 -0
  503. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0f557t9._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_120-cio._.js.map} +0 -0
  504. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_0ra6giw._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_13uyu_v._.js.map} +0 -0
  505. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_107cqfx._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_13x2ww0._.js.map} +0 -0
  506. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1377sl6._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_17og64d._.js.map} +0 -0
  507. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1_2hcok._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1e_sh4o._.js.map} +0 -0
  508. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1g--m6y._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1ecuo9i._.js.map} +0 -0
  509. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1geopi5._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1go8d0m._.js.map} +0 -0
  510. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1i11dte._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1i13ryx._.js.map} +0 -0
  511. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1mj3_qk._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1jv_hid._.js.map} +0 -0
  512. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1qgy210._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1mh5mqk._.js.map} +0 -0
  513. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1rkng9q._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1oq7e8u._.js.map} +0 -0
  514. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1vr8q8y._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1p-cq-p._.js.map} +0 -0
  515. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1x8b64g._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1the3g0._.js.map} +0 -0
  516. /package/.next/server/chunks/{11mp_@anthropic-ai_sdk_index_mjs_1zhahf7._.js.map → 11mp_@anthropic-ai_sdk_index_mjs_1xubh-w._.js.map} +0 -0
  517. /package/.next/server/chunks/{[root-of-the-server]__0hfyuhq._.js.map → [root-of-the-server]__00o3mbd._.js.map} +0 -0
  518. /package/.next/server/chunks/{[root-of-the-server]__0y5usoz._.js.map → [root-of-the-server]__01n_hoh._.js.map} +0 -0
  519. /package/.next/server/chunks/{[root-of-the-server]__08yaps5._.js.map → [root-of-the-server]__05tx02j._.js.map} +0 -0
  520. /package/.next/server/chunks/{[root-of-the-server]__0b2488c._.js.map → [root-of-the-server]__06dfvb0._.js.map} +0 -0
  521. /package/.next/server/chunks/{[root-of-the-server]__1tu85zx._.js.map → [root-of-the-server]__06z8i6e._.js.map} +0 -0
  522. /package/.next/server/chunks/{[root-of-the-server]__0qij7wy._.js.map → [root-of-the-server]__076d4xm._.js.map} +0 -0
  523. /package/.next/server/chunks/{[root-of-the-server]__1ssunti._.js.map → [root-of-the-server]__09j_-hj._.js.map} +0 -0
  524. /package/.next/server/chunks/{[root-of-the-server]__1gvv2xp._.js.map → [root-of-the-server]__0kuhhna._.js.map} +0 -0
  525. /package/.next/server/chunks/{[root-of-the-server]__008focd._.js.map → [root-of-the-server]__0p4w_o-._.js.map} +0 -0
  526. /package/.next/server/chunks/{[root-of-the-server]__1z3tswg._.js.map → [root-of-the-server]__0uu9pgg._.js.map} +0 -0
  527. /package/.next/server/chunks/{[root-of-the-server]__1b448u7._.js.map → [root-of-the-server]__1-1hfrj._.js.map} +0 -0
  528. /package/.next/server/chunks/{[root-of-the-server]__0ikbk15._.js.map → [root-of-the-server]__15jhpgl._.js.map} +0 -0
  529. /package/.next/server/chunks/{[root-of-the-server]__0m8hmg0._.js.map → [root-of-the-server]__19w-7h9._.js.map} +0 -0
  530. /package/.next/server/chunks/{[root-of-the-server]__01xmabe._.js.map → [root-of-the-server]__1af-wfk._.js.map} +0 -0
  531. /package/.next/server/chunks/{[root-of-the-server]__0cbh1s-._.js.map → [root-of-the-server]__1e_o8h4._.js.map} +0 -0
  532. /package/.next/server/chunks/{[root-of-the-server]__16u25oa._.js.map → [root-of-the-server]__1gr4e22._.js.map} +0 -0
  533. /package/.next/server/chunks/{[root-of-the-server]__1jz98vb._.js.map → [root-of-the-server]__1h5hb6u._.js.map} +0 -0
  534. /package/.next/server/chunks/{[root-of-the-server]__1xpp36t._.js.map → [root-of-the-server]__1kw2vct._.js.map} +0 -0
  535. /package/.next/server/chunks/{[root-of-the-server]__0axugex._.js.map → [root-of-the-server]__1lt5cds._.js.map} +0 -0
  536. /package/.next/server/chunks/{[root-of-the-server]__03ogp2r._.js.map → [root-of-the-server]__1rjgpbm._.js.map} +0 -0
  537. /package/.next/server/chunks/{[root-of-the-server]__0x8wtot._.js.map → [root-of-the-server]__1spley9._.js.map} +0 -0
  538. /package/.next/server/chunks/ssr/{0_nd_mermaid_dist_mermaid_core_mjs_027n2yl._.js.map → 0_nd_mermaid_dist_mermaid_core_mjs_0itmgkm._.js.map} +0 -0
  539. /package/.next/server/chunks/ssr/{1u84_katex_dist_katex_mjs_1kb5xea._.js.map → 1u84_katex_dist_katex_mjs_08jn-sj._.js.map} +0 -0
  540. /package/.next/server/chunks/ssr/{node_modules__pnpm_14piqi4._.js.map → _1s2ya35._.js.map} +0 -0
  541. /package/.next/server/chunks/ssr/{node_modules__pnpm_1qp_jvj._.js.map → node_modules__pnpm_00lsytc._.js.map} +0 -0
  542. /package/.next/server/chunks/ssr/{node_modules__pnpm_1ygal0c._.js.map → node_modules__pnpm_02p2rqs._.js.map} +0 -0
  543. /package/.next/server/chunks/ssr/{node_modules__pnpm_1-76qxg._.js.map → node_modules__pnpm_05-p8zy._.js.map} +0 -0
  544. /package/.next/server/chunks/ssr/{node_modules__pnpm_1qmkxyo._.js.map → node_modules__pnpm_060kz-j._.js.map} +0 -0
  545. /package/.next/server/chunks/ssr/{node_modules__pnpm_0ctisl0._.js.map → node_modules__pnpm_0_83tv8._.js.map} +0 -0
  546. /package/.next/server/chunks/ssr/{node_modules__pnpm_0ycbjbd._.js.map → node_modules__pnpm_0_ajzll._.js.map} +0 -0
  547. /package/.next/server/chunks/ssr/{node_modules__pnpm_0kpu0-2._.js.map → node_modules__pnpm_0abf_e9._.js.map} +0 -0
  548. /package/.next/server/chunks/ssr/{node_modules__pnpm_0fwp8jm._.js.map → node_modules__pnpm_0e55e7-._.js.map} +0 -0
  549. /package/.next/server/chunks/ssr/{node_modules__pnpm_1q_hhr3._.js.map → node_modules__pnpm_0eub17j._.js.map} +0 -0
  550. /package/.next/server/chunks/ssr/{node_modules__pnpm_1-r94f7._.js.map → node_modules__pnpm_0gp90ei._.js.map} +0 -0
  551. /package/.next/server/chunks/ssr/{node_modules__pnpm_16u1vfb._.js.map → node_modules__pnpm_0iqb0_x._.js.map} +0 -0
  552. /package/.next/server/chunks/ssr/{node_modules__pnpm_1uwkcin._.js.map → node_modules__pnpm_0j7asqf._.js.map} +0 -0
  553. /package/.next/server/chunks/ssr/{node_modules__pnpm_1f440kx._.js.map → node_modules__pnpm_0jlzk5z._.js.map} +0 -0
  554. /package/.next/server/chunks/ssr/{node_modules__pnpm_189m48n._.js.map → node_modules__pnpm_0rsfj9v._.js.map} +0 -0
  555. /package/.next/server/chunks/ssr/{node_modules__pnpm_01bjcv9._.js.map → node_modules__pnpm_0s63lee._.js.map} +0 -0
  556. /package/.next/server/chunks/ssr/{node_modules__pnpm_1xeothw._.js.map → node_modules__pnpm_0s7j-tv._.js.map} +0 -0
  557. /package/.next/server/chunks/ssr/{node_modules__pnpm_1ssjj4u._.js.map → node_modules__pnpm_0up4z7m._.js.map} +0 -0
  558. /package/.next/server/chunks/ssr/{node_modules__pnpm_06d-fdo._.js.map → node_modules__pnpm_0v_mhl7._.js.map} +0 -0
  559. /package/.next/server/chunks/ssr/{node_modules__pnpm_1a48_nl._.js.map → node_modules__pnpm_0vuao3_._.js.map} +0 -0
  560. /package/.next/server/chunks/ssr/{node_modules__pnpm_0vry74x._.js.map → node_modules__pnpm_14j18h7._.js.map} +0 -0
  561. /package/.next/server/chunks/ssr/{node_modules__pnpm_17i6z2d._.js.map → node_modules__pnpm_16bj927._.js.map} +0 -0
  562. /package/.next/server/chunks/ssr/{node_modules__pnpm_192f222._.js.map → node_modules__pnpm_1ch46nl._.js.map} +0 -0
  563. /package/.next/server/chunks/ssr/{node_modules__pnpm_1txccoj._.js.map → node_modules__pnpm_1dc-yxd._.js.map} +0 -0
  564. /package/.next/server/chunks/ssr/{node_modules__pnpm_1min2jl._.js.map → node_modules__pnpm_1fry8_2._.js.map} +0 -0
  565. /package/.next/server/chunks/ssr/{node_modules__pnpm_1fn3ejy._.js.map → node_modules__pnpm_1gpkxns._.js.map} +0 -0
  566. /package/.next/server/chunks/ssr/{node_modules__pnpm_1aa37e1._.js.map → node_modules__pnpm_1hqh95z._.js.map} +0 -0
  567. /package/.next/server/chunks/ssr/{node_modules__pnpm_03qrzdb._.js.map → node_modules__pnpm_1oaf50x._.js.map} +0 -0
  568. /package/.next/static/{Q29Tn_NjyVms0d3pKn4Yx → qCiKQ9_g49vaoQ-Fewybk}/_buildManifest.js +0 -0
  569. /package/.next/static/{Q29Tn_NjyVms0d3pKn4Yx → qCiKQ9_g49vaoQ-Fewybk}/_clientMiddlewareManifest.js +0 -0
  570. /package/.next/static/{Q29Tn_NjyVms0d3pKn4Yx → qCiKQ9_g49vaoQ-Fewybk}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/board/views/ViewBar.tsx","../../../../src/components/board/views/ViewToolbar.tsx","../../../../src/components/board/TaskCard.tsx","../../../../src/components/board/views/BoardView.tsx","../../../../src/components/board/views/TableView.tsx","../../../../src/components/board/views/EpicView.tsx","../../../../src/components/board/views/TimelineView.tsx","../../../../src/components/board/BulkBar.tsx","../../../../src/components/board/BoardTab.tsx","../../../../src/components/board/NewTaskModal.tsx","../../../../src/app/%28app%29/board/page.tsx","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/chevron-up.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/square-kanban.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/list-filter.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/chart-gantt.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/rows-3.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/sliders-horizontal.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/table-2.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/corner-down-right.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/panel-right-open.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/bookmark.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/rotate-ccw.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/play.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/arrow-up-down.ts"],"sourcesContent":["\"use client\"\n\nimport { useEffect, useRef, useState } from \"react\"\nimport { Bookmark, ChartGantt, ChevronDown, ListTree, Pencil, Plus, RotateCcw, SquareKanban, Table2, Trash2, type LucideIcon } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport type { SavedView, ViewKind } from \"@/lib/board-views\"\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from \"@/components/ui/dropdown-menu\"\n\nconst KIND_ICON: Record<ViewKind, LucideIcon> = { board: SquareKanban, table: Table2, epic: ListTree, timeline: ChartGantt }\nconst BUILT_IN = [\"board\", \"table\", \"epic\", \"timeline\"]\n\nconst focusRing = \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-accent\"\nconst tabClass = cn(\n \"relative inline-flex h-9 shrink-0 items-center gap-1.5 whitespace-nowrap border-b-2 border-transparent px-0.5 text-[13px] font-medium\",\n \"transition-colors duration-(--duration-fast) ease-out-soft\",\n focusRing,\n)\nconst kbdClass = \"rounded-sm border border-border2 bg-surface2 px-1 py-0.5 font-mono text-[10px] leading-none text-txt\"\n\nexport interface ViewBarProps {\n views: SavedView[]\n activeId: string\n onSelect: (id: string) => void\n onNew: () => void\n onRename: (id: string, name: string) => void\n /** Returns true when the view was deleted (the user may cancel the confirm). */\n onDelete: (id: string) => boolean\n /** Built-ins with a saved copy that differs from the default; they get a \"Restore default\" menu. */\n customizedIds: string[]\n onRestore: (id: string) => void\n}\n\nexport function ViewBar({ views, activeId, onSelect, onNew, onRename, onDelete, customizedIds, onRestore }: ViewBarProps) {\n const ordered = [...views.filter(v => BUILT_IN.includes(v.id)), ...views.filter(v => !BUILT_IN.includes(v.id))]\n const [renaming, setRenaming] = useState<string | null>(null)\n // After rename / delete / restore the focused control unmounts; put focus back on a tab instead of <body>.\n const tabs = useRef(new Map<string, HTMLButtonElement>())\n const pendingFocus = useRef<string | null>(null)\n useEffect(() => {\n const want = pendingFocus.current\n if (!want) return\n const el = tabs.current.get(want)\n if (!el) return\n el.focus()\n pendingFocus.current = null\n })\n\n return (\n <div role=\"group\" aria-label=\"Views\" className=\"flex items-center gap-4 overflow-x-auto border-b border-border [scrollbar-width:none]\">\n {ordered.map(v => {\n const builtIn = BUILT_IN.includes(v.id)\n const Icon = builtIn ? KIND_ICON[v.kind] : Bookmark\n const active = v.id === activeId\n if (renaming === v.id) {\n return (\n <RenameInput\n key={v.id}\n initial={v.name}\n onDone={(name, byKey) => {\n setRenaming(null)\n if (byKey) pendingFocus.current = v.id\n if (name && name !== v.name) onRename(v.id, name)\n }}\n />\n )\n }\n return (\n <span key={v.id} className=\"inline-flex shrink-0 items-center\">\n <button\n ref={el => { if (el) tabs.current.set(v.id, el); else tabs.current.delete(v.id) }}\n type=\"button\"\n aria-pressed={active}\n title={builtIn ? undefined : `Saved view: ${v.name}`}\n onClick={() => onSelect(v.id)}\n className={cn(tabClass, active ? \"text-txt\" : \"text-muted hover:text-txt\")}\n >\n <Icon aria-hidden className={builtIn ? \"size-[15px]\" : \"size-3.5\"} />\n {v.name}\n {/* One named underline: it glides to the new tab when the view changes (a View Transition) */}\n {active && <span aria-hidden className=\"absolute inset-x-0 -bottom-0.5 h-0.5 bg-accent [view-transition-name:board-view-tab]\" />}\n </button>\n {active && (!builtIn || customizedIds.includes(v.id)) && (\n <DropdownMenu>\n <DropdownMenuTrigger\n aria-label={`View options for ${v.name}`}\n className={cn(\"ml-0.5 inline-flex size-6 items-center justify-center rounded-sm text-muted hover:bg-surface2 hover:text-txt\", focusRing)}\n >\n <ChevronDown aria-hidden className=\"size-3.5\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n {builtIn ? (\n <DropdownMenuItem onSelect={() => { pendingFocus.current = v.id; onRestore(v.id) }}>\n <RotateCcw aria-hidden className=\"size-3.5\" />Restore default\n </DropdownMenuItem>\n ) : (\n <>\n <DropdownMenuItem onSelect={() => setRenaming(v.id)}>\n <Pencil aria-hidden className=\"size-3.5\" />Rename\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={() => { if (onDelete(v.id)) pendingFocus.current = v.kind }}\n className=\"text-danger focus:text-danger\"\n >\n <Trash2 aria-hidden className=\"size-3.5\" />Delete view\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </span>\n )\n })}\n <button\n type=\"button\"\n aria-label=\"New view\"\n title=\"New view\"\n onClick={onNew}\n className={cn(tabClass, \"border-transparent text-muted hover:text-txt\")}\n >\n <Plus aria-hidden className=\"size-[15px]\" />\n </button>\n <span className=\"grow\" />\n <span className=\"hidden shrink-0 items-center gap-1.5 pb-1.5 text-[11px] text-muted sm:flex\">\n <kbd className={kbdClass}>v</kbd>next view\n <kbd className={cn(kbdClass, \"ml-1.5\")}>1</kbd>–<kbd className={kbdClass}>4</kbd>\n </span>\n </div>\n )\n}\n\n/** `byKey`: finished with Enter / Esc (focus returns to the tab), not by clicking away. */\nfunction RenameInput({ initial, onDone }: { initial: string; onDone: (name: string, byKey: boolean) => void }) {\n const [name, setName] = useState(initial)\n const ref = useRef<HTMLInputElement>(null)\n const done = useRef(false)\n const finish = (value: string, byKey = false) => {\n if (done.current) return\n done.current = true\n onDone(value.trim(), byKey)\n }\n useEffect(() => {\n // After the dropdown closes (it restores focus to its trigger first).\n const t = setTimeout(() => ref.current?.select(), 0)\n return () => clearTimeout(t)\n }, [])\n return (\n <input\n ref={ref}\n aria-label=\"View name\"\n value={name}\n maxLength={60}\n onChange={e => setName(e.target.value)}\n onBlur={() => finish(name)}\n onKeyDown={e => {\n if (e.key === \"Enter\") finish(name, true)\n if (e.key === \"Escape\") {\n e.stopPropagation()\n finish(initial, true)\n }\n }}\n className=\"my-1 h-7 w-40 shrink-0 rounded-md border border-accent bg-bg px-2 text-[13px] text-txt outline-hidden\"\n />\n )\n}\n","\"use client\"\n\nimport { useEffect, useId, useRef, useState, type ReactNode } from \"react\"\nimport { ArrowDown, ArrowUp, ArrowUpDown, Bookmark, ChevronDown, ListFilter, Plus, Rows3, Search, SlidersHorizontal, X } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport type { FilterProp, FilterRule, GroupBy, PropertyKey, SortProp, SortRule, ViewState } from \"@/lib/board-views\"\nimport { StatusIcon, useStatusLabel } from \"@/components/shared/StatusIcon\"\nimport { useStatusDefs } from \"@/components/shared/status-defs\"\nimport {\n DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuLabel,\n DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\n\n// ── vocabulary ────────────────────────────────────────────────────────────────\n\ntype Op = FilterRule[\"op\"]\n\nconst FILTER_PROPS: { prop: FilterProp; label: string }[] = [\n { prop: \"status\", label: \"Status\" }, { prop: \"epic\", label: \"Epic\" }, { prop: \"size\", label: \"Size\" },\n { prop: \"due\", label: \"Due\" }, { prop: \"deps\", label: \"Depends on\" }, { prop: \"tests\", label: \"Tests\" },\n { prop: \"agent\", label: \"Agent\" }, { prop: \"ready\", label: \"Ready\" }, { prop: \"owner\", label: \"Owner\" },\n]\nconst PROP_LABEL = Object.fromEntries(FILTER_PROPS.map(p => [p.prop, p.label])) as Record<FilterProp, string>\n\n/** Ops offered per prop, with how each reads after the prop name. */\nconst OPS: Record<FilterProp, Partial<Record<Op, string>>> = {\n status: { is: \"is\", \"is-not\": \"is not\" },\n epic: { is: \"is\", \"is-not\": \"is not\" },\n size: { is: \"is\", \"is-not\": \"is not\" },\n due: { before: \"is before\", after: \"is after\", \"is-set\": \"is set\", \"not-set\": \"is not set\" },\n deps: { \"is-set\": \"anything\", \"not-set\": \"nothing\" },\n tests: { \"is-set\": \"reported\", \"not-set\": \"not reported\" },\n agent: { \"is-set\": \"is active\", \"not-set\": \"is not active\" },\n ready: { \"is-set\": \"yes\", \"not-set\": \"no\" },\n owner: { is: \"is\", \"is-not\": \"is not\" },\n}\nconst LIST_PROPS: FilterProp[] = [\"status\", \"epic\", \"size\", \"owner\"]\nconst OWNER_LABEL: Record<string, string> = { human: \"Human\", ai: \"AI agent\", none: \"No owner\" }\nconst SIZES = [\"XS\", \"S\", \"M\", \"L\", \"XL\"]\n\nconst SORT_PROPS: { prop: SortProp; label: string }[] = [\n { prop: \"status\", label: \"Status\" }, { prop: \"id\", label: \"ID\" }, { prop: \"epic\", label: \"Epic\" },\n { prop: \"size\", label: \"Size\" }, { prop: \"due\", label: \"Due\" }, { prop: \"title\", label: \"Title\" },\n]\nconst GROUPS: { value: GroupBy; label: string }[] = [\n { value: \"status\", label: \"Status\" }, { value: \"epic\", label: \"Epic\" }, { value: \"size\", label: \"Size\" }, { value: \"owner\", label: \"Owner\" }, { value: \"none\", label: \"None\" },\n]\nconst LANES: { value: ViewState[\"subGroup\"]; label: string }[] = [\n { value: \"epic\", label: \"Epic\" }, { value: \"size\", label: \"Size\" }, { value: \"none\", label: \"None\" },\n]\nconst PROPERTIES: { key: PropertyKey; label: string }[] = [\n { key: \"status\", label: \"Status\" }, { key: \"epic\", label: \"Epic\" }, { key: \"size\", label: \"Size\" }, { key: \"due\", label: \"Due\" },\n { key: \"deps\", label: \"Depends on\" }, { key: \"tests\", label: \"Tests\" }, { key: \"agent\", label: \"Agent\" }, { key: \"owner\", label: \"Owner\" },\n]\n\nfunction localToday(): string {\n const d = new Date()\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, \"0\")}-${String(d.getDate()).padStart(2, \"0\")}`\n}\n\ntype EpicOption = { id: string; title: string; open?: boolean }\n\nfunction newRule(prop: FilterProp, epics: EpicOption[]): FilterRule {\n switch (prop) {\n case \"status\": return { prop, op: \"is-not\", value: [\"done\"] }\n case \"epic\": return { prop, op: \"is\", value: [(epics.find(e => e.open) ?? epics[0])?.id ?? \"none\"] }\n case \"size\": return { prop, op: \"is\", value: [\"M\"] }\n case \"due\": return { prop, op: \"before\", value: [localToday()] }\n case \"owner\": return { prop, op: \"is\", value: [\"ai\"] }\n default: return { prop, op: \"is-set\", value: [] }\n }\n}\n\n// ── styles ────────────────────────────────────────────────────────────────────\n\nconst focusRing = \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-1 focus-visible:ring-offset-bg\"\nconst btn = cn(\n \"inline-flex h-8 items-center gap-1.5 whitespace-nowrap rounded-md border border-transparent px-2.5 text-xs font-medium text-muted\",\n \"transition-colors duration-(--duration-fast) ease-out-soft hover:bg-surface2 hover:text-txt\",\n focusRing,\n)\nconst btnOn = \"border-border2 bg-surface2 text-txt\"\nconst sel = cn(\"h-7.5 min-w-0 rounded-md border border-border bg-bg px-2 text-[13px] text-txt\", focusRing)\nconst kbdClass = \"rounded-sm border border-border2 bg-surface2 px-1 py-0.5 font-mono text-[10px] leading-none text-txt\"\nconst iconBtn = cn(\"inline-flex size-7 shrink-0 items-center justify-center rounded-md text-muted hover:bg-surface2 hover:text-txt disabled:opacity-40 disabled:hover:bg-transparent\", focusRing)\n\n// ── popover ───────────────────────────────────────────────────────────────────\n\n/**\n * Non-modal popover: trigger button + absolutely positioned panel. Esc closes and returns focus to the trigger,\n * an outside pointer-down closes. The wrapper is only `relative` from sm up; below that the panel anchors to the\n * nearest positioned ancestor (the toolbar's button row) so it can span the screen.\n */\nfunction Popover({\n open, onOpenChange, label, trigger, triggerClassName, panelClassName, anchorClassName, children,\n}: {\n open: boolean\n onOpenChange: (open: boolean) => void\n label: string\n trigger: ReactNode\n triggerClassName?: string\n panelClassName?: string\n anchorClassName?: string\n children: ReactNode\n}) {\n const wrapRef = useRef<HTMLDivElement>(null)\n const triggerRef = useRef<HTMLButtonElement>(null)\n const panelRef = useRef<HTMLDivElement>(null)\n const onOpenChangeRef = useRef(onOpenChange)\n const id = useId()\n\n useEffect(() => {\n onOpenChangeRef.current = onOpenChange\n })\n\n // Deps are [open] only: callers pass inline callbacks, and refocusing on every render would steal focus.\n useEffect(() => {\n if (!open) return\n panelRef.current?.querySelector<HTMLElement>(\"button, input, select\")?.focus()\n const onDown = (e: PointerEvent) => {\n if (!wrapRef.current?.contains(e.target as Node)) onOpenChangeRef.current(false)\n }\n document.addEventListener(\"pointerdown\", onDown)\n return () => document.removeEventListener(\"pointerdown\", onDown)\n }, [open])\n\n return (\n <div ref={wrapRef} className={cn(\"max-sm:flex max-sm:flex-1\", anchorClassName ?? \"sm:relative\")}>\n <button\n ref={triggerRef}\n type=\"button\"\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-controls={open ? id : undefined}\n onClick={() => onOpenChange(!open)}\n className={triggerClassName}\n >\n {trigger}\n </button>\n {open && (\n <div\n ref={panelRef}\n id={id}\n role=\"dialog\"\n aria-label={label}\n onKeyDown={e => {\n if (e.key !== \"Escape\") return\n e.stopPropagation()\n onOpenChange(false)\n triggerRef.current?.focus()\n }}\n className={cn(\n \"absolute top-full z-30 mt-1 rounded-lg border border-border2 bg-surface p-3 text-txt shadow-lg\",\n \"origin-top-right animate-in fade-in-0 zoom-in-[0.98] slide-in-from-top-1 duration-(--duration-fast) ease-out-soft\",\n panelClassName,\n )}\n >\n {children}\n </div>\n )}\n </div>\n )\n}\n\n// ── toolbar ───────────────────────────────────────────────────────────────────\n\nexport interface ViewToolbarProps {\n state: ViewState\n onChange: (next: ViewState) => void\n /** `open`: the epic still has open work (a new Epic rule defaults to the first such). */\n epics: EpicOption[]\n dirty: boolean\n activeIsBuiltIn: boolean\n onSave: () => void\n onSaveAs: (name: string) => void\n onReset: () => void\n /** The integrator focuses #id on \"/\". */\n searchInputId: string\n filterOpen: boolean\n /** \"f\" key opens it. */\n onFilterOpenChange: (open: boolean) => void\n}\n\nexport function ViewToolbar({\n state, onChange, epics, dirty, activeIsBuiltIn, onSave, onSaveAs, onReset, searchInputId, filterOpen, onFilterOpenChange,\n}: ViewToolbarProps) {\n const [sortOpen, setSortOpen] = useState(false)\n const set = (patch: Partial<ViewState>) => onChange({ ...state, ...patch })\n\n // The input owns its value: the URL (state.q) syncs a tick late, which would jump the caret.\n // Adopt state.q only when it changes from outside (Reset, view switch), not while our own writes catch up.\n const [q, setQ] = useState(state.q)\n const [seenQ, setSeenQ] = useState(state.q)\n const [pendingQ, setPendingQ] = useState<string | null>(null)\n if (state.q !== seenQ) {\n setSeenQ(state.q)\n if (state.q === pendingQ) setPendingQ(null)\n else if (pendingQ === null) setQ(state.q)\n }\n const typeQ = (value: string) => {\n setQ(value)\n setPendingQ(value === state.q ? null : value)\n set({ q: value })\n }\n const timeline = state.kind === \"timeline\"\n const board = state.kind === \"board\"\n const groups = timeline ? GROUPS.filter(g => g.value === \"epic\" || g.value === \"none\") : GROUPS\n const groupLabel = GROUPS.find(g => g.value === state.group)?.label ?? \"None\"\n const laneLabel = LANES.find(l => l.value === state.subGroup)?.label ?? \"None\"\n const mobileBtn = \"max-sm:h-9 max-sm:flex-1 max-sm:justify-center max-sm:border-border\"\n\n return (\n <div className=\"flex flex-col gap-2.5\">\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:gap-1\">\n <label className=\"flex h-8 w-full items-center gap-2 rounded-md border border-border bg-bg px-2.5 text-[13px] text-muted focus-within:border-accent sm:w-65 max-sm:h-9\">\n <Search aria-hidden className=\"size-3.5 shrink-0\" />\n <span className=\"sr-only\">Filter by title or ID</span>\n <input\n id={searchInputId}\n type=\"search\"\n value={q}\n placeholder=\"Filter by title or ID…\"\n onChange={e => typeQ(e.target.value)}\n onKeyDown={e => {\n if (e.key !== \"Escape\") return\n if (q) typeQ(\"\")\n else e.currentTarget.blur()\n }}\n className=\"min-w-0 grow bg-transparent text-txt outline-hidden placeholder:text-muted [&::-webkit-search-cancel-button]:hidden\"\n />\n <kbd className={cn(kbdClass, \"max-sm:hidden\")}>/</kbd>\n </label>\n <span className=\"grow max-sm:hidden\" />\n\n <div className=\"relative flex gap-1.5 max-sm:w-full sm:static sm:gap-1\">\n <Popover\n open={filterOpen}\n onOpenChange={onFilterOpenChange}\n label=\"Filter\"\n triggerClassName={cn(btn, mobileBtn, (filterOpen || state.filters.length > 0) && btnOn)}\n panelClassName=\"inset-x-0 sm:left-auto sm:right-0 sm:w-140\"\n trigger={<>\n <ListFilter aria-hidden className=\"size-3.5\" />Filter\n {state.filters.length > 0 && <span className=\"font-mono text-txt\">{state.filters.length}</span>}\n <kbd className={cn(kbdClass, \"ml-0.5 max-sm:hidden\")}>f</kbd>\n </>}\n >\n <FilterBuilder filters={state.filters} epics={epics} onChange={filters => set({ filters })} />\n </Popover>\n\n <Popover\n open={sortOpen}\n onOpenChange={setSortOpen}\n label=\"Sort\"\n triggerClassName={cn(btn, mobileBtn, (sortOpen || state.sorts.length > 0) && btnOn)}\n panelClassName=\"inset-x-0 sm:left-auto sm:right-0 sm:w-95\"\n trigger={<>\n <ArrowUpDown aria-hidden className=\"size-3.5\" />Sort\n {state.sorts.length > 0 && <span className=\"font-mono text-txt\">{state.sorts.length}</span>}\n </>}\n >\n <SortBuilder sorts={state.sorts} onChange={sorts => set({ sorts })} />\n </Popover>\n\n <DropdownMenu>\n {/* The phone board stacks status sections (no swimlanes), so the control would do nothing there. */}\n <DropdownMenuTrigger className={cn(btn, mobileBtn, board && \"max-md:hidden\")}>\n <Rows3 aria-hidden className=\"size-3.5\" />\n <span className=\"max-sm:hidden\">Group</span>\n {board ? (\n <span className=\"text-txt\">Status{state.subGroup !== \"none\" && <><span className=\"px-1 text-muted\">›</span>{laneLabel}</>}</span>\n ) : (\n <span className=\"text-txt\">{groupLabel}</span>\n )}\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {board ? (\n <>\n <DropdownMenuLabel className=\"text-xs text-muted\">Swimlanes</DropdownMenuLabel>\n <DropdownMenuRadioGroup value={state.subGroup} onValueChange={v => set({ subGroup: v as ViewState[\"subGroup\"] })}>\n {LANES.map(l => <DropdownMenuRadioItem key={l.value} value={l.value}>{l.label}</DropdownMenuRadioItem>)}\n </DropdownMenuRadioGroup>\n </>\n ) : (\n <>\n <DropdownMenuLabel className=\"text-xs text-muted\">Group by</DropdownMenuLabel>\n <DropdownMenuRadioGroup value={state.group} onValueChange={v => set({ group: v as GroupBy })}>\n {groups.map(g => <DropdownMenuRadioItem key={g.value} value={g.value}>{g.label}</DropdownMenuRadioItem>)}\n </DropdownMenuRadioGroup>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n\n {!timeline && (\n <DropdownMenu>\n <DropdownMenuTrigger className={cn(btn, \"max-sm:hidden\")}>\n <SlidersHorizontal aria-hidden className=\"size-3.5\" />Properties\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel className=\"text-xs text-muted\">Show</DropdownMenuLabel>\n {PROPERTIES.map(p => (\n <DropdownMenuCheckboxItem\n key={p.key}\n checked={state.properties.includes(p.key)}\n onSelect={e => e.preventDefault()}\n onCheckedChange={on => set({\n properties: PROPERTIES.map(x => x.key).filter(k => (k === p.key ? on === true : state.properties.includes(k))),\n })}\n >\n {p.label}\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n {state.filters.map((rule, i) => (\n <FilterChip key={i} rule={rule} onRemove={() => set({ filters: state.filters.filter((_, j) => j !== i) })} />\n ))}\n <button type=\"button\" onClick={() => onFilterOpenChange(true)} className={cn(btn, \"h-6.5 px-2\")}>\n <Plus aria-hidden className=\"size-3.25\" />Add filter\n </button>\n <span className=\"grow\" />\n {dirty && (\n <SaveArea activeIsBuiltIn={activeIsBuiltIn} onSave={onSave} onSaveAs={onSaveAs} onReset={onReset} />\n )}\n </div>\n </div>\n )\n}\n\n// ── chips ─────────────────────────────────────────────────────────────────────\n\nfunction valueText(rule: FilterRule, label: (key: string) => string): { text: string; mono: boolean } {\n if (rule.prop === \"status\") return { text: rule.value.map(label).join(\", \"), mono: false }\n if (rule.prop === \"epic\") return { text: rule.value.map(v => (v === \"none\" ? \"No epic\" : v)).join(\", \"), mono: !rule.value.includes(\"none\") }\n if (rule.prop === \"owner\") return { text: rule.value.map(v => OWNER_LABEL[v] ?? v).join(\", \"), mono: false }\n return { text: rule.value.join(\", \"), mono: true }\n}\n\nfunction opText(rule: FilterRule): string {\n if (rule.op === \"is\" && rule.value.length > 1) return \"is any of\"\n return OPS[rule.prop][rule.op] ?? rule.op\n}\n\nfunction FilterChip({ rule, onRemove }: { rule: FilterRule; onRemove: () => void }) {\n const hasValue = !(rule.op === \"is-set\" || rule.op === \"not-set\")\n const v = valueText(rule, useStatusLabel())\n const text = `${PROP_LABEL[rule.prop]} ${opText(rule)}${hasValue ? ` ${v.text}` : \"\"}`\n return (\n <span className=\"inline-flex h-6.5 max-w-full items-center gap-1.5 rounded-sm border border-border2 bg-surface pl-2.25 pr-1 text-xs text-txt\">\n <span className=\"truncate\">\n <b className=\"font-medium text-muted\">{PROP_LABEL[rule.prop]}</b> {opText(rule)}\n {hasValue && <> <span className={cn(\"text-txt\", v.mono && \"font-mono text-[11px]\")}>{v.text || \"—\"}</span></>}\n </span>\n <button type=\"button\" aria-label={`Remove filter: ${text}`} onClick={onRemove} className={cn(\"inline-flex rounded-xs p-0.75 text-muted hover:text-txt\", focusRing)}>\n <X aria-hidden className=\"size-3\" />\n </button>\n </span>\n )\n}\n\nfunction SaveArea({ activeIsBuiltIn, onSave, onSaveAs, onReset }: { activeIsBuiltIn: boolean; onSave: () => void; onSaveAs: (name: string) => void; onReset: () => void }) {\n const [naming, setNaming] = useState(false)\n const [name, setName] = useState(\"\")\n const submit = () => {\n const n = name.trim()\n if (!n) return\n onSaveAs(n)\n setNaming(false)\n setName(\"\")\n }\n if (naming) {\n return (\n <form className=\"flex items-center gap-1.5\" onSubmit={e => { e.preventDefault(); submit() }}>\n <input\n autoFocus\n aria-label=\"New view name\"\n placeholder=\"View name\"\n value={name}\n maxLength={60}\n onChange={e => setName(e.target.value)}\n onKeyDown={e => { if (e.key === \"Escape\") { e.stopPropagation(); setNaming(false) } }}\n className=\"h-7 w-44 rounded-md border border-accent bg-bg px-2 text-[13px] text-txt outline-hidden placeholder:text-muted\"\n />\n <button type=\"submit\" disabled={!name.trim()} className={cn(btn, btnOn, \"h-7 disabled:opacity-40\")}>Save</button>\n <button type=\"button\" onClick={() => setNaming(false)} className={cn(btn, \"h-7\")}>Cancel</button>\n </form>\n )\n }\n return (\n <div className=\"flex items-center gap-1\">\n <span className=\"mr-1 text-xs text-muted\">Unsaved changes</span>\n <button type=\"button\" onClick={onReset} className={cn(btn, \"text-txt\")}>Reset</button>\n <button type=\"button\" onClick={() => setNaming(true)} className={cn(btn, \"text-txt\")}>\n {activeIsBuiltIn ? \"Save as new view\" : \"Save as new\"}\n </button>\n <button type=\"button\" onClick={onSave} className={cn(btn, btnOn)}>\n <Bookmark aria-hidden className=\"size-3.25\" />Save view\n </button>\n </div>\n )\n}\n\n// ── filter builder ────────────────────────────────────────────────────────────\n\nfunction FilterBuilder({ filters, epics, onChange }: { filters: FilterRule[]; epics: EpicOption[]; onChange: (f: FilterRule[]) => void }) {\n const update = (i: number, rule: FilterRule) => onChange(filters.map((r, j) => (j === i ? rule : r)))\n const labelId = useId()\n return (\n <div>\n <p id={labelId} className=\"mb-2.5 ml-0.5 text-xs font-semibold\">Show tasks where</p>\n {filters.length === 0 && <p className=\"mb-1 ml-0.5 text-xs text-muted\">No filters yet. Every task shows except cancelled ones.</p>}\n <ul aria-labelledby={labelId} className=\"flex flex-col gap-1.5\">\n {filters.map((rule, i) => {\n const ops = Object.entries(OPS[rule.prop]) as [Op, string][]\n const n = i + 1\n return (\n <li key={i} className=\"flex flex-wrap items-center gap-1.5 text-xs text-muted sm:grid sm:grid-cols-[48px_120px_100px_minmax(0,1fr)_28px]\">\n <span className=\"w-10 pl-1 sm:w-auto\">{i === 0 ? \"Where\" : \"and\"}</span>\n <select\n aria-label={`Rule ${n} property`}\n value={rule.prop}\n onChange={e => update(i, newRule(e.target.value as FilterProp, epics))}\n className={cn(sel, \"w-32.5 sm:w-auto\")}\n >\n {FILTER_PROPS.map(p => <option key={p.prop} value={p.prop}>{p.label}</option>)}\n </select>\n <select\n aria-label={`Rule ${n} condition`}\n value={rule.op}\n onChange={e => {\n const op = e.target.value as Op\n const value = op === \"is-set\" || op === \"not-set\" ? [] : rule.value.length ? rule.value : newRule(rule.prop, epics).value\n update(i, { ...rule, op, value })\n }}\n className={cn(sel, \"w-27.5 sm:w-auto\")}\n >\n {ops.map(([op, label]) => <option key={op} value={op}>{label}</option>)}\n </select>\n <span className=\"min-w-0 grow basis-40 sm:basis-auto\">\n <ValueControl rule={rule} n={n} epics={epics} onChange={value => update(i, { ...rule, value })} />\n </span>\n <button type=\"button\" aria-label={`Remove rule ${n}`} onClick={() => onChange(filters.filter((_, j) => j !== i))} className={iconBtn}>\n <X aria-hidden className=\"size-3.5\" />\n </button>\n </li>\n )\n })}\n </ul>\n <div className=\"mt-2.5 flex flex-wrap items-center gap-1.5 border-t border-border pt-2.5\">\n <button type=\"button\" onClick={() => onChange([...filters, newRule(\"status\", epics)])} className={btn}>\n <Plus aria-hidden className=\"size-3.5\" />Add rule\n </button>\n <span className=\"grow\" />\n <span className=\"text-[11px] text-muted max-sm:hidden\">Rules combine with and</span>\n </div>\n </div>\n )\n}\n\nfunction ValueControl({ rule, n, epics, onChange }: { rule: FilterRule; n: number; epics: EpicOption[]; onChange: (v: string[]) => void }) {\n if (rule.op === \"is-set\" || rule.op === \"not-set\") return null\n if (rule.prop === \"due\") {\n return (\n <input\n type=\"date\"\n aria-label={`Rule ${n} date`}\n value={rule.value[0] ?? \"\"}\n onChange={e => onChange(e.target.value ? [e.target.value] : [])}\n className={cn(sel, \"w-full scheme-dark\")}\n />\n )\n }\n if (!LIST_PROPS.includes(rule.prop)) return null\n return <MultiSelect rule={rule} n={n} epics={epics} onChange={onChange} />\n}\n\nfunction MultiSelect({ rule, n, epics, onChange }: { rule: FilterRule; n: number; epics: EpicOption[]; onChange: (v: string[]) => void }) {\n const [open, setOpen] = useState(false)\n const defs = useStatusDefs()\n const label = useStatusLabel()\n const options: { value: string; node: ReactNode }[] =\n rule.prop === \"status\"\n ? defs.map(d => ({ value: d.id, node: <><StatusIcon status={d.id} />{d.label}</> }))\n : rule.prop === \"epic\"\n ? [\n { value: \"none\", node: <span className=\"text-muted\">No epic</span> },\n ...epics.map(e => ({ value: e.id, node: <><span className=\"font-mono text-[11px] text-muted\">{e.id}</span><span className=\"truncate\">{e.title}</span></> })),\n ]\n : rule.prop === \"owner\"\n ? Object.entries(OWNER_LABEL).map(([value, label]) => ({ value, node: <span>{label}</span> }))\n : SIZES.map(s => ({ value: s, node: <span className=\"font-mono\">{s}</span> }))\n const first = rule.value[0]\n const summary =\n !first ? <span className=\"text-muted\">Choose…</span>\n : rule.prop === \"status\" ? <><StatusIcon status={first} /><span className=\"truncate\">{label(first)}</span></>\n : rule.prop === \"owner\" ? <span className=\"truncate\">{OWNER_LABEL[first] ?? first}</span>\n : rule.prop === \"epic\" && first !== \"none\" ? <><span className=\"font-mono text-[11px] text-muted\">{first}</span><span className=\"truncate\">{epics.find(e => e.id === first)?.title ?? \"\"}</span></>\n : <span className={cn(\"truncate\", rule.prop === \"size\" && \"font-mono\")}>{first === \"none\" ? \"No epic\" : first}</span>\n\n return (\n <Popover\n open={open}\n onOpenChange={setOpen}\n label={`${PROP_LABEL[rule.prop]} values`}\n anchorClassName=\"relative\"\n triggerClassName={cn(sel, \"flex w-full items-center gap-1.5 text-left\")}\n panelClassName=\"left-0 z-40 max-h-64 w-64 overflow-y-auto p-1\"\n trigger={<>\n <span className=\"sr-only\">Rule {n} values: </span>\n {summary}\n {rule.value.length > 1 && <span className=\"font-mono text-[11px] text-muted\">+{rule.value.length - 1}</span>}\n <span className=\"grow\" />\n <ChevronDown aria-hidden className=\"size-3.5 shrink-0 text-muted\" />\n </>}\n >\n <ul className=\"flex flex-col\">\n {options.map(o => (\n <li key={o.value}>\n <label className=\"flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-[13px] text-txt hover:bg-surface2\">\n <input\n type=\"checkbox\"\n checked={rule.value.includes(o.value)}\n onChange={e => onChange(e.target.checked ? [...rule.value, o.value] : rule.value.filter(v => v !== o.value))}\n className=\"size-3.5 accent-accent\"\n />\n <span className=\"flex min-w-0 items-center gap-1.5\">{o.node}</span>\n </label>\n </li>\n ))}\n </ul>\n </Popover>\n )\n}\n\n// ── sort builder ──────────────────────────────────────────────────────────────\n\nfunction SortBuilder({ sorts, onChange }: { sorts: SortRule[]; onChange: (s: SortRule[]) => void }) {\n const update = (i: number, rule: SortRule) => onChange(sorts.map((r, j) => (j === i ? rule : r)))\n const move = (i: number, d: -1 | 1) => {\n const next = [...sorts]\n ;[next[i], next[i + d]] = [next[i + d], next[i]]\n onChange(next)\n }\n const unused = SORT_PROPS.filter(p => !sorts.some(s => s.prop === p.prop))\n return (\n <div>\n <p className=\"mb-2.5 ml-0.5 text-xs font-semibold\">Sort by</p>\n {sorts.length === 0 && <p className=\"mb-1 ml-0.5 text-xs text-muted\">Default order: by ID.</p>}\n <ol className=\"flex flex-col gap-1.5\">\n {sorts.map((rule, i) => {\n const n = i + 1\n const label = SORT_PROPS.find(p => p.prop === rule.prop)?.label ?? rule.prop\n return (\n <li key={rule.prop} className=\"flex items-center gap-1\">\n <button type=\"button\" aria-label={`Move ${label} sort up`} disabled={i === 0} onClick={() => move(i, -1)} className={iconBtn}>\n <ArrowUp aria-hidden className=\"size-3.5\" />\n </button>\n <button type=\"button\" aria-label={`Move ${label} sort down`} disabled={i === sorts.length - 1} onClick={() => move(i, 1)} className={iconBtn}>\n <ArrowDown aria-hidden className=\"size-3.5\" />\n </button>\n <select\n aria-label={`Sort ${n} property`}\n value={rule.prop}\n onChange={e => update(i, { ...rule, prop: e.target.value as SortProp })}\n className={cn(sel, \"ml-0.5 grow\")}\n >\n {SORT_PROPS.filter(p => p.prop === rule.prop || !sorts.some(s => s.prop === p.prop)).map(p => (\n <option key={p.prop} value={p.prop}>{p.label}</option>\n ))}\n </select>\n <select\n aria-label={`Sort ${n} direction`}\n value={rule.dir}\n onChange={e => update(i, { ...rule, dir: e.target.value as SortRule[\"dir\"] })}\n className={cn(sel, \"w-37.5\")}\n >\n <option value=\"asc\">{rule.prop === \"status\" ? \"Workflow order\" : \"Ascending\"}</option>\n <option value=\"desc\">{rule.prop === \"status\" ? \"Reverse workflow\" : \"Descending\"}</option>\n </select>\n <button type=\"button\" aria-label={`Remove ${label} sort`} onClick={() => onChange(sorts.filter((_, j) => j !== i))} className={iconBtn}>\n <X aria-hidden className=\"size-3.5\" />\n </button>\n </li>\n )\n })}\n </ol>\n <div className=\"mt-2.5 border-t border-border pt-2.5\">\n <button type=\"button\" disabled={!unused.length} onClick={() => onChange([...sorts, { prop: unused[0].prop, dir: \"asc\" }])} className={cn(btn, \"disabled:opacity-40\")}>\n <Plus aria-hidden className=\"size-3.5\" />Add sort\n </button>\n </div>\n <p className=\"mx-0.5 mt-2 text-[11px] leading-normal text-muted\">Workflow order: In progress → Review → Todo → Blocked → Done. Ties fall back to ID.</p>\n </div>\n )\n}\n","\"use client\"\n\nimport { useState } from \"react\"\nimport Link from \"next/link\"\nimport { CornerDownRight, CornerUpLeft, FlaskConical, MoreHorizontal, PanelRightOpen, Trash2 } from \"lucide-react\"\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger } from \"@/components/ui/dropdown-menu\"\nimport { useApp } from \"@/context/AppContext\"\nimport { deleteTaskWithUndo } from \"./task-api\"\nimport { OwnerChip } from \"@/components/shared/OwnerChip\"\nimport { TaskDueField, TaskOwnerField, TaskSizeField } from \"./TaskFields\"\nimport { toast } from \"@/components/ui/toast\"\nimport { cn } from \"@/lib/utils\"\nimport type { Task } from \"@/types\"\nimport { AgentDot } from \"@/components/chat/AgentMark\"\nimport { latestReview } from \"@/lib/review\"\nimport { epicOf, sizeOf, type PropertyKey } from \"@/lib/board-views\"\n\nconst ALL_PROPERTIES: PropertyKey[] = [\"status\", \"epic\", \"size\", \"due\", \"deps\", \"tests\", \"agent\", \"owner\"]\n\ninterface TaskCardProps {\n task: Task\n onOpen: () => void\n /** Which lines show; defaults to every property. */\n properties?: PropertyKey[]\n selected?: boolean\n /** Shift / Cmd / Ctrl-click toggles selection instead of opening */\n onSelect?: () => void\n}\n\n/**\n * A task on the board. The column already says the status, so the card doesn't repeat it.\n * Click (or Enter) opens the task panel, where every action lives; drag moves it between columns.\n */\nexport function TaskCard({ task, onOpen, properties = ALL_PROPERTIES, selected = false, onSelect }: TaskCardProps) {\n const [isDragging, setIsDragging] = useState(false)\n const show = (p: PropertyKey) => properties.includes(p)\n const epic = show(\"epic\") && task.phase ? epicOf(task.phase) : null\n const sentBack = task.status === \"todo\" && task.raw ? latestReview(task.raw) : null\n const size = show(\"size\") ? sizeOf(task) : null\n const done = task.status === \"done\" || task.status === \"cancelled\"\n const deps = show(\"deps\") ? task.dependsOn.match(/\\bT\\d+\\b/g) ?? [] : []\n const tests = show(\"tests\") ? task.manualTests : null\n const changesRequested = sentBack?.outcome === \"changes requested\"\n\n return (\n <div\n draggable\n role=\"button\"\n tabIndex={0}\n aria-label={`${task.id} ${task.title}`}\n aria-pressed={onSelect ? selected : undefined}\n onClick={(e) => { if (onSelect && (e.shiftKey || e.metaKey || e.ctrlKey)) onSelect(); else onOpen() }}\n onKeyDown={(e) => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); onOpen() } }}\n onDragStart={(e) => {\n e.dataTransfer.setData(\"taskId\", task.id)\n e.dataTransfer.effectAllowed = \"move\"\n setIsDragging(true)\n }}\n onDragEnd={() => setIsDragging(false)}\n style={{ viewTransitionName: `task-${task.file.replace(/[^a-zA-Z0-9_-]/g, \"_\")}` }}\n className={cn(\n \"group cursor-pointer rounded-lg border border-border bg-surface px-3 py-2.5 text-left outline-hidden\",\n \"transition-[border-color,background-color,opacity,box-shadow] duration-(--duration-fast)\",\n \"hover:border-border2 hover:bg-surface2/50 focus-visible:border-accent/60 focus-visible:shadow-[0_0_0_3px_rgb(var(--rgb-accent)/0.15)]\",\n isDragging && \"cursor-grabbing opacity-50\",\n selected && \"border-accent bg-accent/5 hover:border-accent\",\n )}\n >\n <div className=\"flex items-center gap-1.5 font-mono text-[11px] text-muted\">\n <span>{task.id}</span>\n {show(\"agent\") && <AgentDot attach={{ kind: \"task\", id: task.id }} />}\n {show(\"owner\") && task.owner && (\n <TaskOwnerField task={task}><OwnerChip owner={task.owner} className=\"text-[10px] [&_svg]:size-3\" /></TaskOwnerField>\n )}\n <span className=\"flex-1\" />\n {show(\"due\") && task.due && !done && <TaskDueField task={task}><span title=\"Due\">{task.due.slice(5)}</span></TaskDueField>}\n {size && <TaskSizeField task={task}><span title={task.size} className=\"rounded-sm bg-surface2 px-1 text-[10px]\">{size}</span></TaskSizeField>}\n <CardMenu task={task} onOpen={onOpen} />\n </div>\n\n <p className={cn(\"mt-1 line-clamp-2 text-[13px] font-medium leading-snug\", done ? \"text-muted\" : \"text-txt\")}>{task.title}</p>\n\n {(epic || changesRequested || deps.length > 0 || tests) && (\n <div className=\"mt-2 flex flex-wrap items-center gap-x-2 gap-y-1.5\">\n {epic && (\n <span className=\"inline-flex min-w-0 max-w-full items-center gap-1 text-[11px] text-muted\" title={task.phase}>\n {epic.id && <span className=\"font-mono text-[10px]\">{epic.id}</span>}\n <span className=\"truncate\">{epic.title}</span>\n </span>\n )}\n {changesRequested && (\n <span\n title={sentBack?.note}\n className=\"inline-flex items-center gap-1 rounded-sm border border-amber/40 bg-amber/5 px-1.5 py-0.5 text-[10px] text-amber\"\n >\n <CornerUpLeft className=\"size-3\" aria-hidden /> changes requested\n </span>\n )}\n {deps.length > 0 && (\n <span title={`Depends on ${deps.join(\", \")}`} className=\"inline-flex items-center gap-1 font-mono text-[10px] text-muted\">\n <CornerDownRight className=\"size-3\" aria-label=\"Depends on\" />\n {deps.join(\", \")}\n </span>\n )}\n {tests && (\n <Link\n href={`/manual-tests#${task.id}`}\n draggable={false}\n onClick={(e) => e.stopPropagation()}\n title={`Manual tests: ${tests.done} of ${tests.total} ticked`}\n className={cn(\n \"inline-flex items-center gap-1 rounded-sm border px-1.5 py-0.5 font-mono text-[10px] transition-colors hover:border-accent/50\",\n tests.done === tests.total ? \"border-teal/30 bg-teal/5 text-teal\" : \"border-border text-muted\",\n )}\n >\n <FlaskConical className=\"size-3\" aria-hidden />\n {tests.done}/{tests.total}\n </Link>\n )}\n </div>\n )}\n </div>\n )\n}\n\n/** ⋯ on the card (on hover / focus). Events are stopped so the card doesn't open or drag underneath. */\nfunction CardMenu({ task, onOpen }: { task: Task; onOpen: () => void }) {\n const { rootParam } = useApp()\n const stop = (e: React.SyntheticEvent) => e.stopPropagation()\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n draggable={false}\n aria-label={`Actions for ${task.id}`}\n onClick={stop}\n onKeyDown={stop}\n className=\"-my-1 -mr-1 grid size-5 place-items-center rounded-sm text-muted opacity-0 transition-opacity hover:bg-surface2 hover:text-txt focus-visible:opacity-100 group-hover:opacity-100 data-[state=open]:opacity-100\"\n >\n <MoreHorizontal className=\"size-3.5\" />\n </button>\n </DropdownMenuTrigger>\n {/* React events bubble through the portal to the card: stop them here */}\n <DropdownMenuContent align=\"end\" className=\"w-40\" onClick={stop} onKeyDown={stop}>\n <DropdownMenuItem onSelect={onOpen}><PanelRightOpen /> Open</DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onSelect={() => { deleteTaskWithUndo(task, rootParam).catch((e: Error) => toast(e.message)) }}\n className=\"text-danger focus:text-danger\"\n >\n <Trash2 /> Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","\"use client\"\n\nimport { useState, type ReactNode } from \"react\"\nimport { ChevronDown, ChevronRight } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport type { Task, TaskStatus } from \"@/types\"\nimport { groupTasks, type PropertyKey, type TaskGroup, type ViewState } from \"@/lib/board-views\"\nimport { StatusIcon, useStatusLabel } from \"@/components/shared/StatusIcon\"\nimport { useStatusDefs } from \"@/components/shared/status-defs\"\nimport { displayStatus } from \"@/lib/statuses\"\nimport { TaskCard } from \"../TaskCard\"\n\nexport interface ViewProps {\n tasks: Task[]\n allTasks: Task[]\n state: ViewState\n agentTasks: Set<string>\n onOpenTask: (task: Task) => void\n selected?: Set<string>\n /** Toggle (or with `on`, set) selection for these ids */\n onToggleSelect?: (ids: string[], on?: boolean) => void\n}\n\n/** A column is a status key: built-in or one of the project's own (R055). */\ntype Column = string\n/** Review is optional: a task can wait there for a human, but nothing has to pass through it. */\n/** Mobile stacks sections by urgency: by category in this order, then the project's order within one. */\nconst URGENCY: TaskStatus[] = [\"in-progress\", \"review\", \"todo\", \"blocked\", \"paused\", \"done\"]\n/** Newest done IDs shown in the collapsed Done column. */\nconst DONE_IDS = 5\n/** Fully done lanes shown before \"+ N more … all done\". */\nconst DONE_LANES = 4\n\n/** One 4px mark per task, in its status hue (same as the Manual tests / Activity marks). */\nconst MARK: Record<TaskStatus, string> = {\n todo: \"bg-border2\",\n \"in-progress\": \"bg-amber\",\n review: \"bg-accent\",\n blocked: \"bg-danger\",\n paused: \"bg-muted/60\",\n done: \"bg-teal\",\n cancelled: \"bg-border\",\n}\n\nconst isDone = (t: Task) => t.status === \"done\" || t.status === \"cancelled\"\nconst newestFirst = (a: Task, b: Task) => b.id.localeCompare(a.id, undefined, { numeric: true })\n/** Cancelled tasks (shown only when a status filter names them) sit in Done, matching the lane tallies. */\nconst inColumn = (tasks: Task[], col: Column) => tasks.filter((t) => displayStatus(t) === col || (col === \"done\" && t.status === \"cancelled\"))\n\nexport function BoardView({ tasks, state, onOpenTask, onMoveTask, selected, onToggleSelect }: ViewProps & { onMoveTask: (id: string, status: string) => void }) {\n const [doneOpen, setDoneOpen] = useState(false)\n const defs = useStatusDefs()\n const label = useStatusLabel()\n // The project's statuses in its order; cancelled shows inside Done. Paused and Done sit collapsed until opened.\n const COLUMNS: Column[] = defs.filter((d) => d.id !== \"cancelled\").map((d) => d.id)\n const MOBILE_ORDER: Column[] = [...defs.filter((d) => d.id !== \"cancelled\")]\n .sort((a, b) => URGENCY.indexOf(a.category) - URGENCY.indexOf(b.category)).map((d) => d.id)\n const [pausedOpen, setPausedOpen] = useState(false)\n const [laneOpen, setLaneOpen] = useState<Record<string, boolean>>({})\n const [showAllDoneLanes, setShowAllDoneLanes] = useState(false)\n // Empty lane cells are drop targets; they only draw a box while a card is being dragged\n const [dragging, setDragging] = useState(false)\n\n if (tasks.length === 0) {\n return (\n <div className=\"grid place-items-center rounded-lg border border-dashed border-border px-4 py-12 text-center\">\n <p className=\"text-sm font-medium text-txt\">No tasks match these filters.</p>\n <p className=\"mt-1 text-xs text-muted\">Remove a filter or clear the search to see more.</p>\n </div>\n )\n }\n\n const lanes: TaskGroup[] | null = state.subGroup === \"none\" ? null : groupTasks(tasks, state.subGroup)\n // A card inside an epic lane doesn't repeat the epic\n const properties: PropertyKey[] = state.subGroup === \"epic\" ? state.properties.filter((p) => p !== \"epic\") : state.properties\n const card = (t: Task) => (\n <TaskCard\n key={t.id}\n task={t}\n properties={properties}\n onOpen={() => onOpenTask(t)}\n selected={selected?.has(t.id)}\n onSelect={onToggleSelect && (() => onToggleSelect([t.id]))}\n />\n )\n // Lanes with open work first, then fully done ones (collapsed, capped)\n const openLanes = lanes?.filter((l) => !l.tasks.every(isDone)) ?? []\n const doneLanes = lanes?.filter((l) => l.tasks.every(isDone)) ?? []\n const hiddenDoneLanes = showAllDoneLanes ? 0 : Math.max(0, doneLanes.length - DONE_LANES)\n const shownLanes = [...openLanes, ...doneLanes.slice(0, doneLanes.length - hiddenDoneLanes)]\n const laneNoun = state.subGroup === \"epic\" ? \"epics\" : \"sizes\"\n // Done cards always sit in the Done column: it widens when opened, or when you open a finished lane to see its cards\n const doneWide = doneOpen || doneLanes.some((l) => laneOpen[l.key])\n const toggleDone = () => {\n if (doneWide) { setDoneOpen(false); setLaneOpen((m) => Object.fromEntries(Object.entries(m).filter(([k]) => !doneLanes.some((l) => l.key === k)))) }\n else setDoneOpen(true)\n }\n const width = (col: Column) => ((col === \"done\" && !doneWide) || (col === \"paused\" && !pausedOpen) ? \"140px\" : \"minmax(0,1fr)\")\n const grid = { gridTemplateColumns: COLUMNS.map(width).join(\" \") }\n\n const cells = (list: Task[], compact: boolean) =>\n COLUMNS.map((col) => {\n const colTasks = inColumn(list, col)\n return (\n <DropCell key={col} status={col} onMoveTask={onMoveTask}>\n {(col === \"done\" && !doneWide) || (col === \"paused\" && !pausedOpen) ? (\n <ColumnSummary tasks={colTasks} noun={col === \"done\" ? \"done\" : \"paused\"} compact={compact} dragging={dragging} onOpenTask={onOpenTask} />\n ) : colTasks.length ? (\n (col === \"done\" ? [...colTasks].sort(newestFirst) : colTasks).map(card)\n ) : compact && !dragging ? null : (\n <div className=\"grid h-11 place-items-center rounded-lg border border-dashed border-border text-[11px] text-muted/70\">\n {compact ? \"\" : \"Drop a task here\"}\n </div>\n )}\n </DropCell>\n )\n })\n\n return (\n <>\n {/* Desktop: status columns, optionally split into swimlanes */}\n <div className=\"hidden md:block\" onDragStartCapture={() => setDragging(true)} onDragEndCapture={() => setDragging(false)}>\n <div className={cn(\"grid gap-3 border-b border-border\", lanes && \"pl-7.5\")} style={grid}>\n {COLUMNS.map((col) => (\n // The header is a drop target too, so a card can always reach every status (even when all lanes are done)\n <DropCell key={col} status={col} onMoveTask={onMoveTask} header>\n <div className=\"flex min-w-0 items-center gap-1.5 px-0.5 pb-2 text-xs font-semibold text-txt\">\n <StatusIcon status={col} />\n <h2 className=\"truncate\">{label(col)}</h2>\n <span className=\"font-mono font-normal text-muted tabular-nums\">{inColumn(tasks, col).length}</span>\n {(col === \"done\" || col === \"paused\") && (() => {\n const wide = col === \"done\" ? doneWide : pausedOpen\n return (\n <>\n <span className=\"flex-1\" />\n <button\n type=\"button\"\n onClick={col === \"done\" ? toggleDone : () => setPausedOpen((v) => !v)}\n aria-expanded={wide}\n aria-label={`${wide ? \"Collapse\" : \"Expand\"} ${label(col)}`}\n className=\"-my-1 grid size-6 place-items-center rounded-md text-muted outline-hidden transition-colors duration-(--duration-fast) hover:bg-surface2 hover:text-txt focus-visible:ring-2 focus-visible:ring-accent/60\"\n >\n <ChevronRight className={cn(\"size-3.5 transition-transform duration-(--duration-base) ease-out-soft\", wide && \"rotate-180\")} aria-hidden />\n </button>\n </>\n )\n })()}\n </div>\n </DropCell>\n ))}\n </div>\n\n {!lanes ? (\n <div className=\"grid gap-3 pt-3\" style={grid}>{cells(tasks, false)}</div>\n ) : (\n <>\n {shownLanes.map((lane) => {\n const allDone = lane.tasks.every(isDone)\n const open = laneOpen[lane.key] ?? !allDone\n const doneCount = lane.tasks.filter(isDone).length\n return (\n <section key={lane.key} aria-label={lane.epicId ? `${lane.epicId} ${lane.label}` : lane.label}>\n <button\n type=\"button\"\n onClick={() => setLaneOpen((m) => ({ ...m, [lane.key]: !open }))}\n aria-expanded={open}\n className=\"mt-1.5 flex h-8.5 w-full items-center gap-2.5 rounded-md px-1.5 text-left outline-hidden transition-colors duration-(--duration-fast) hover:bg-surface2 focus-visible:ring-2 focus-visible:ring-accent/60\"\n >\n {open ? <ChevronDown className=\"size-3.5 shrink-0 text-muted\" aria-hidden /> : <ChevronRight className=\"size-3.5 shrink-0 text-muted\" aria-hidden />}\n {lane.epicId && <span className=\"font-mono text-[11px] text-muted\">{lane.epicId}</span>}\n <span className=\"min-w-0 truncate text-[13px] font-semibold text-txt\">{lane.label}</span>\n <span className=\"flex w-30 shrink-0 gap-0.5\" aria-hidden>\n {lane.tasks.map((t) => <span key={t.id} className={cn(\"h-1 flex-1 rounded-full\", MARK[t.status])} />)}\n </span>\n <span className=\"font-mono text-[11px] text-muted tabular-nums\" aria-label={`${doneCount} of ${lane.tasks.length} done`}>\n <span className=\"text-txt\">{doneCount}</span>/{lane.tasks.length}\n </span>\n {allDone && <span className=\"text-xs text-muted\">all done</span>}\n </button>\n <div className={cn(\"grid transition-[grid-template-rows,opacity] duration-(--duration-base) ease-out-soft\", open ? \"grid-rows-[1fr] opacity-100\" : \"grid-rows-[0fr] opacity-0\")}>\n <div className=\"min-h-0 overflow-hidden\" inert={!open}>\n <div className=\"grid gap-3 pt-2 pb-1 pl-7.5\" style={grid}>{cells(lane.tasks, true)}</div>\n </div>\n </div>\n </section>\n )\n })}\n {hiddenDoneLanes > 0 && (\n <p className=\"mt-2 ml-9 text-xs text-muted\">\n + <span className=\"font-mono\">{hiddenDoneLanes}</span> more {laneNoun}, all done ·{\" \"}\n <button\n type=\"button\"\n onClick={() => setShowAllDoneLanes(true)}\n className=\"rounded-sm text-txt underline decoration-accent underline-offset-2 outline-hidden hover:decoration-txt focus-visible:ring-2 focus-visible:ring-accent/60\"\n >\n Show\n </button>\n </p>\n )}\n </>\n )}\n </div>\n\n {/* Mobile: stacked status sections, no columns */}\n <div className=\"md:hidden\">\n {tasks.every(isDone) && <p className=\"mt-3.5 text-sm text-muted\">Nothing open. Every task here is done.</p>}\n {MOBILE_ORDER.map((col) => {\n const colTasks = inColumn(tasks, col)\n if (!colTasks.length) return null\n const collapsed = (col === \"done\" && !doneOpen) || (col === \"paused\" && !pausedOpen)\n return (\n <section key={col} aria-label={label(col)}>\n <h2 className=\"mt-3.5 mb-2 flex items-center gap-1.5 text-xs font-semibold text-txt\">\n <StatusIcon status={col} />\n {label(col)}\n <span className=\"font-mono font-normal text-muted tabular-nums\">{colTasks.length}</span>\n <span className=\"h-px flex-1 bg-border\" />\n {(col === \"done\" || col === \"paused\") && (\n <button\n type=\"button\"\n onClick={() => (col === \"done\" ? setDoneOpen : setPausedOpen)((v) => !v)}\n aria-expanded={!collapsed}\n className=\"min-h-11 rounded-md px-2 text-xs font-normal text-muted outline-hidden hover:text-txt focus-visible:ring-2 focus-visible:ring-accent/60\"\n >\n {collapsed ? \"Show\" : \"Hide\"}\n </button>\n )}\n </h2>\n {!collapsed && <div className=\"flex flex-col gap-2\">{(col === \"done\" ? [...colTasks].sort(newestFirst) : colTasks).map(card)}</div>}\n </section>\n )\n })}\n </div>\n </>\n )\n}\n\n/** A drop target for one status (a whole column, or one lane's slice of it). Dropping only changes status. */\nfunction DropCell({ status, onMoveTask, header = false, children }: { status: Column; onMoveTask: (id: string, status: string) => void; header?: boolean; children: ReactNode }) {\n const [over, setOver] = useState(false)\n return (\n <div\n data-column={header ? undefined : status}\n data-column-header={header ? status : undefined}\n className={cn(\n \"flex min-w-0 flex-col gap-2 rounded-lg\",\n !header && \"min-h-11\",\n \"transition-[background-color,box-shadow] duration-(--duration-fast)\",\n over && \"bg-accent/5 shadow-[0_0_0_1px_rgb(var(--rgb-accent)/0.5)]\",\n )}\n onDragOver={(e) => { e.preventDefault(); setOver(true) }}\n onDragLeave={(e) => { if (!e.currentTarget.contains(e.relatedTarget as Node)) setOver(false) }}\n onDrop={(e) => {\n e.preventDefault()\n setOver(false)\n const taskId = e.dataTransfer.getData(\"taskId\")\n if (taskId) onMoveTask(taskId, status)\n }}\n >\n {children}\n </div>\n )\n}\n\n/** Collapsed Done / Paused: the count and the newest few IDs (each opens its task). */\nfunction ColumnSummary({ tasks, noun, compact, dragging, onOpenTask }: { tasks: Task[]; noun: string; compact: boolean; dragging: boolean; onOpenTask: (task: Task) => void }) {\n if (!tasks.length) {\n if (compact && !dragging) return null\n return <div className=\"grid h-11 place-items-center rounded-lg border border-dashed border-border text-[11px] text-muted/70\">{compact ? \"\" : \"Drop here\"}</div>\n }\n const newest = [...tasks].sort(newestFirst).slice(0, DONE_IDS)\n return (\n <div className=\"flex flex-col gap-1 rounded-lg border border-dashed border-border2 px-2 py-1.5 text-[11px] text-muted\">\n <span className=\"flex flex-wrap gap-x-1.5 font-mono\">\n {newest.map((t) => (\n <button\n key={t.id}\n type=\"button\"\n onClick={() => onOpenTask(t)}\n title={t.title}\n className=\"rounded-sm text-txt outline-hidden hover:text-accent focus-visible:ring-2 focus-visible:ring-accent/60\"\n >\n {t.id}\n </button>\n ))}\n </span>\n <span><span className=\"font-mono\">{tasks.length}</span> {noun}</span>\n </div>\n )\n}\n","\"use client\"\n\nimport { useState, type MouseEvent } from \"react\"\nimport { ArrowDown, ArrowUp, Bot, ChevronRight, FlaskConical } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport { useStatusDefs } from \"@/components/shared/status-defs\"\nimport { localToday } from \"@/lib/roadmap-health\"\nimport { TaskDueField, TaskOwnerField, TaskSizeField, TaskStatusField } from \"../TaskFields\"\nimport { epicOf, groupTasks, type PropertyKey, type SortProp, type SortRule, type TaskGroup, type ViewState } from \"@/lib/board-views\"\nimport type { Task, TaskStatus } from \"@/types\"\n\ninterface ViewProps {\n tasks: Task[]\n allTasks: Task[]\n state: ViewState\n agentTasks: Set<string>\n onOpenTask: (task: Task) => void\n selected?: Set<string>\n onToggleSelect?: (ids: string[], on?: boolean) => void\n}\n\ntype TableViewProps = ViewProps & { onSort: (sorts: SortRule[]) => void }\n\nconst ORDER: PropertyKey[] = [\"status\", \"epic\", \"owner\", \"size\", \"due\", \"deps\", \"tests\", \"agent\"]\nconst LABEL: Record<PropertyKey, string> = {\n status: \"Status\", epic: \"Epic\", size: \"Size\", due: \"Due\", deps: \"Depends on\", tests: \"Tests\", agent: \"Agent\", owner: \"Owner\",\n}\nconst WIDTH: Record<PropertyKey, string> = {\n status: \"w-[120px]\", epic: \"w-[170px]\", size: \"w-[56px]\", due: \"w-[92px]\", deps: \"w-[140px]\", tests: \"w-[72px]\", agent: \"w-[88px]\", owner: \"w-[104px]\",\n}\n/** Hidden below md: the phone table keeps ID · Title · Status · Due · Agent. */\nconst WIDE_ONLY = new Set<PropertyKey>([\"epic\", \"size\", \"deps\", \"tests\", \"owner\"])\nconst SORTABLE = new Set<string>([\"id\", \"title\", \"status\", \"epic\", \"size\", \"due\"])\nconst MARK_BG: Record<TaskStatus, string> = {\n todo: \"bg-border2\", \"in-progress\": \"bg-amber\", review: \"bg-accent\", blocked: \"bg-danger\", paused: \"bg-muted/60\", done: \"bg-teal\", cancelled: \"bg-border\",\n}\n\nconst cellMono = \"font-mono text-[11px] text-muted\"\nconst ring = \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent\"\n\n/** Click = the only sort (asc, then desc); shift-click = add / flip a secondary sort. */\nexport function nextSorts(sorts: SortRule[], prop: SortProp, additive: boolean): SortRule[] {\n const i = sorts.findIndex((s) => s.prop === prop)\n const flip = (s: SortRule): SortRule => ({ prop: s.prop, dir: s.dir === \"asc\" ? \"desc\" : \"asc\" })\n if (additive) {\n return i < 0 ? [...sorts, { prop, dir: \"asc\" }] : sorts.map((s, j) => (j === i ? flip(s) : s))\n }\n return sorts.length === 1 && i === 0 ? [flip(sorts[0])] : [{ prop, dir: \"asc\" }]\n}\n\nexport function TableView({ tasks, state, agentTasks, onOpenTask, onSort, selected = new Set(), onToggleSelect }: TableViewProps) {\n const defs = useStatusDefs()\n const props = ORDER.filter((p) => state.properties.includes(p))\n const groups: TaskGroup[] =\n state.group === \"none\" ? [{ key: \"all\", label: \"All tasks\", epicId: null, tasks }] : groupTasks(tasks, state.group, defs)\n // Groups whose tasks are all done start collapsed; the user's toggles override.\n const [toggled, setToggled] = useState<Record<string, boolean>>({})\n const today = localToday()\n\n if (tasks.length === 0) {\n return (\n <div className=\"rounded-lg border border-border px-4 py-12 text-center\">\n <p className=\"text-sm text-txt\">No tasks match these filters.</p>\n <p className=\"mt-1 text-xs text-muted\">Remove a filter or clear the search to see more.</p>\n </div>\n )\n }\n\n const colCount = 3 + props.length\n const allPicked = tasks.every((t) => selected.has(t.id))\n const check = \"size-3.5 cursor-pointer accent-[var(--color-accent)]\"\n const hideSm = (p: PropertyKey) => (WIDE_ONLY.has(p) ? \"hidden md:table-cell\" : \"\")\n\n const header = (key: string, label: string, extra = \"\") => {\n const idx = state.sorts.findIndex((s) => s.prop === key)\n const rule = idx >= 0 ? state.sorts[idx] : null\n if (!SORTABLE.has(key)) {\n return <th key={key} scope=\"col\" className={cn(\"px-2.5 text-left font-medium\", extra)}>{label}</th>\n }\n const Arrow = rule?.dir === \"desc\" ? ArrowDown : ArrowUp\n return (\n <th\n key={key}\n scope=\"col\"\n aria-sort={idx === 0 ? (rule?.dir === \"desc\" ? \"descending\" : \"ascending\") : \"none\"}\n className={cn(\"px-1 text-left font-medium\", extra)}\n >\n <button\n type=\"button\"\n title=\"Click to sort · Shift-click to add a sort\"\n onClick={(e) => onSort(nextSorts(state.sorts, key as SortProp, e.shiftKey))}\n className={cn(\n \"inline-flex h-7 items-center gap-1 rounded-sm px-1.5 transition-colors duration-(--duration-fast) ease-out-soft hover:bg-surface2 hover:text-txt\",\n rule && \"text-txt\",\n ring,\n )}\n >\n {label}\n {rule && (\n <>\n <Arrow className=\"size-3\" aria-hidden />\n <span className=\"font-mono text-[10px] text-muted\">{idx + 1}</span>\n </>\n )}\n </button>\n </th>\n )\n }\n\n const cell = (task: Task, p: PropertyKey) => {\n const cls = cn(\"px-2.5\", hideSm(p))\n switch (p) {\n case \"status\": {\n return (\n <td key={p} className={cls}>\n <TaskStatusField task={task} />\n </td>\n )\n }\n case \"epic\": {\n const epic = epicOf(task.phase)\n return (\n <td key={p} className={cls}>\n {epic.id || epic.title ? (\n <span className=\"flex min-w-0 items-center gap-1.5 text-xs\">\n {epic.id && <span className={cellMono}>{epic.id}</span>}\n <span className=\"truncate text-muted\">{epic.title}</span>\n </span>\n ) : <span className={cellMono}>—</span>}\n </td>\n )\n }\n case \"size\":\n return <td key={p} className={cn(cls, cellMono)}><TaskSizeField task={task} /></td>\n case \"owner\":\n return <td key={p} className={cls}><TaskOwnerField task={task} /></td>\n case \"due\": {\n const overdue = !!task.due && task.status !== \"done\" && task.status !== \"cancelled\" && task.due < today\n return (\n <td key={p} className={cn(cls, cellMono)}>\n <TaskDueField task={task}><span className={cn(\"font-mono text-[11px]\", overdue ? \"text-amber\" : task.due ? \"text-muted\" : \"text-muted/70\")}>{task.due ?? \"—\"}</span></TaskDueField>\n </td>\n )\n }\n case \"deps\": {\n const ids = task.dependsOn.match(/T\\d+/g)\n return <td key={p} className={cn(cls, cellMono, \"truncate\")}>{ids ? ids.join(\", \") : \"—\"}</td>\n }\n case \"tests\":\n return (\n <td key={p} className={cn(cls, cellMono)}>\n {task.manualTests ? (\n <span className=\"inline-flex items-center gap-1\">\n <FlaskConical className=\"size-3\" aria-hidden />\n {task.manualTests.done}/{task.manualTests.total}\n </span>\n ) : \"—\"}\n </td>\n )\n case \"agent\":\n return (\n <td key={p} className={cls}>\n {agentTasks.has(task.id) ? (\n <span className=\"inline-flex items-center gap-1 text-[11px] text-txt\">\n <Bot className=\"size-3.5 text-accent\" aria-hidden />working\n </span>\n ) : <span className={cellMono}>—</span>}\n </td>\n )\n }\n }\n\n const row = (task: Task) => {\n const done = task.status === \"done\" || task.status === \"cancelled\"\n return (\n <tr\n key={task.id}\n onClick={(e: MouseEvent) => {\n // The title button handles its own click (and Enter); this covers the rest of the row.\n if ((e.target as HTMLElement).closest(\"button\")) return\n onOpenTask(task)\n }}\n className={cn(\n \"h-9 cursor-pointer border-b border-border text-[13px] transition-colors duration-(--duration-fast) ease-out-soft last:border-b-0 hover:bg-surface2\",\n selected.has(task.id) && \"bg-accent/5\",\n )}\n >\n <td className=\"pl-3\" onClick={(e) => e.stopPropagation()}>\n <input\n type=\"checkbox\"\n aria-label={`Select ${task.id}`}\n checked={selected.has(task.id)}\n onChange={() => onToggleSelect?.([task.id])}\n className={check}\n />\n </td>\n <td className={cn(\"px-2.5\", cellMono)}>{task.id}</td>\n <td className=\"min-w-0 px-1\">\n <button\n type=\"button\"\n onClick={() => onOpenTask(task)}\n title={task.title}\n className={cn(\"block w-full truncate rounded-sm px-1.5 py-1 text-left font-medium\", done ? \"text-muted\" : \"text-txt\", ring)}\n >\n {task.title}\n </button>\n </td>\n {props.map((p) => cell(task, p))}\n </tr>\n )\n }\n\n return (\n <div className=\"overflow-x-auto rounded-lg border border-border\">\n <table className=\"w-full min-w-[580px] table-fixed border-collapse md:min-w-[760px]\">\n <colgroup>\n <col className=\"w-[34px]\" />\n <col className=\"w-[72px]\" />\n <col className=\"w-[200px] md:w-auto\" />\n {props.map((p) => <col key={p} className={cn(WIDTH[p], WIDE_ONLY.has(p) && \"hidden md:table-column\")} />)}\n </colgroup>\n <thead>\n <tr className=\"h-[34px] border-b border-border2 bg-bg text-[11px] text-muted\">\n <th scope=\"col\" className=\"pl-3 text-left\">\n <input\n type=\"checkbox\"\n aria-label=\"Select all shown tasks\"\n checked={allPicked}\n onChange={() => onToggleSelect?.(tasks.map((t) => t.id), !allPicked)}\n className={check}\n />\n </th>\n {header(\"id\", \"ID\")}\n {header(\"title\", \"Title\")}\n {props.map((p) => header(p, LABEL[p], hideSm(p)))}\n </tr>\n </thead>\n {groups.map((g) => {\n const doneCount = g.tasks.filter((t) => t.status === \"done\").length\n const allDone = g.tasks.length > 0 && g.tasks.every((t) => t.status === \"done\" || t.status === \"cancelled\")\n const open = state.group === \"none\" || (toggled[g.key] ?? !allDone)\n return (\n <tbody key={g.key}>\n {state.group !== \"none\" && (\n <tr className=\"h-[38px] border-b border-border bg-surface\">\n <th scope=\"rowgroup\" colSpan={colCount} className=\"p-0 text-left font-normal\">\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setToggled((s) => ({ ...s, [g.key]: !open }))}\n className={cn(\"flex h-[38px] w-full items-center gap-2.5 px-2 text-left transition-colors duration-(--duration-fast) ease-out-soft hover:bg-surface2\", ring)}\n >\n <ChevronRight\n className={cn(\"size-3.5 shrink-0 text-muted transition-transform duration-(--duration-fast) ease-out-soft\", open && \"rotate-90\")}\n aria-hidden\n />\n {g.epicId && <span className={cellMono}>{g.epicId}</span>}\n <span className=\"min-w-0 truncate text-[13px] font-semibold text-txt\">{g.label}</span>\n <span className=\"flex w-[110px] shrink-0 gap-0.5\" aria-hidden>\n {g.tasks.map((t) => <span key={t.id} className={cn(\"h-1 flex-1 rounded-full\", MARK_BG[t.status])} />)}\n </span>\n <span className={cellMono}>\n <span className=\"text-txt\">{doneCount}</span>/{g.tasks.length}\n </span>\n </button>\n </th>\n </tr>\n )}\n {open && g.tasks.map(row)}\n </tbody>\n )\n })}\n </table>\n </div>\n )\n}\n","\"use client\"\n\nimport { useMemo, useState } from \"react\"\nimport { Bot, ChevronRight, Play } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport type { Task, TaskStatus } from \"@/types\"\nimport { depOutline, groupTasks, isReady, sizeOf, type TaskGroup, type ViewState } from \"@/lib/board-views\"\nimport { STATUS_META, StatusIcon } from \"@/components/shared/StatusIcon\"\n\ninterface ViewProps {\n tasks: Task[]\n allTasks: Task[]\n state: ViewState\n agentTasks: Set<string>\n onOpenTask: (task: Task) => void\n}\n\nconst RING = \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n/** Collapsed all-done epics shown before \"+ N more\". */\nconst DONE_SHOWN = 3\nconst UP_NEXT_MAX = 5\n\nconst MARK_BG: Record<TaskStatus, string> = {\n todo: \"bg-border2\",\n \"in-progress\": \"bg-amber\",\n review: \"bg-accent\",\n blocked: \"bg-danger\",\n paused: \"bg-muted/60\",\n done: \"bg-teal\",\n cancelled: \"bg-border2\",\n}\n\nconst idNum = (id: string) => parseInt(id.replace(/\\D/g, \"\"), 10) || 0\nconst byId = (a: Task, b: Task) => idNum(a.id) - idNum(b.id)\nconst depIds = (t: Task) => t.dependsOn.match(/T\\d+/g) ?? []\n\nfunction epicStatus(tasks: Task[]): TaskStatus {\n if (tasks.some(t => t.status === \"in-progress\" || t.status === \"review\")) return \"in-progress\"\n const open = tasks.filter(t => t.status !== \"done\" && t.status !== \"cancelled\")\n if (open.length > 0 && open.every(t => t.status === \"blocked\")) return \"blocked\"\n if (tasks.length > 0 && tasks.every(t => t.status === \"done\")) return \"done\"\n return \"todo\"\n}\n\nexport function EpicView({ tasks, allTasks, agentTasks, onOpenTask }: ViewProps) {\n const [expanded, setExpanded] = useState<Set<string>>(new Set())\n const [showAllDone, setShowAllDone] = useState(false)\n\n const taskMap = useMemo(() => new Map(allTasks.map(t => [t.id, t])), [allTasks])\n const groups = useMemo(() => groupTasks(tasks, \"epic\"), [tasks])\n\n // vibedoc_next_task order: epic order, then ID.\n const { firstReady, upNext } = useMemo(() => {\n const firstReady = new Set<string>()\n const ready: Task[] = []\n const waiting: { task: Task; on: string }[] = []\n for (const g of groups) {\n const sorted = [...g.tasks].sort(byId)\n const r = sorted.filter(t => isReady(t, taskMap))\n if (r[0]) firstReady.add(r[0].id)\n ready.push(...r)\n for (const t of sorted) {\n if (t.status !== \"todo\" && t.status !== \"blocked\") continue\n const open = depIds(t).filter(id => taskMap.get(id)?.status !== \"done\")\n if (open.length === 1) waiting.push({ task: t, on: open[0] })\n }\n }\n const upNext = [\n ...ready.map(task => ({ task, on: null as string | null })),\n ...waiting,\n ].slice(0, UP_NEXT_MAX)\n return { firstReady, upNext }\n }, [groups, taskMap])\n\n if (tasks.length === 0) {\n return (\n <div className=\"px-8 py-16 text-center\">\n <p className=\"text-sm font-medium text-txt\">No tasks match these filters.</p>\n <p className=\"mt-1 text-xs text-muted\">Clear a filter or the search to see more epics.</p>\n </div>\n )\n }\n\n const toggle = (key: string) =>\n setExpanded(prev => {\n const next = new Set(prev)\n if (next.has(key)) next.delete(key)\n else next.add(key)\n return next\n })\n\n let doneSeen = 0\n const hidden: TaskGroup[] = []\n const sections = groups.map(g => {\n const status = epicStatus(g.tasks)\n if (status === \"done\" && !expanded.has(g.key)) {\n doneSeen++\n if (doneSeen > DONE_SHOWN && !showAllDone) {\n hidden.push(g)\n return null\n }\n return <DoneLine key={g.key} group={g} onExpand={() => toggle(g.key)} />\n }\n return (\n <EpicSection\n key={g.key}\n group={g}\n status={status}\n collapsible={status === \"done\"}\n onCollapse={() => toggle(g.key)}\n firstReady={firstReady}\n agentTasks={agentTasks}\n onOpenTask={onOpenTask}\n />\n )\n })\n\n return (\n <div className=\"grid gap-6 px-4 pt-[18px] pb-8 sm:px-8 lg:grid-cols-[minmax(0,1fr)_280px]\">\n <div className=\"flex min-w-0 flex-col gap-3.5\">\n {sections}\n {hidden.length > 0 && (\n <p className=\"mx-0.5 text-xs text-muted\">\n + <span className=\"font-mono\">{hidden.slice(0, 3).map(g => g.epicId ?? g.label).join(\", \")}</span>\n {hidden.length > 3 && <> and <span className=\"font-mono\">{hidden.length - 3}</span> more</>}, all done ·{\" \"}\n <button type=\"button\" onClick={() => setShowAllDone(true)} className={cn(\"rounded-sm text-txt underline decoration-accent underline-offset-2 hover:decoration-txt\", RING)}>\n Show\n </button>\n </p>\n )}\n </div>\n\n <aside aria-label=\"Up next\" className=\"flex flex-col gap-2.5 lg:pt-1\">\n <p className=\"text-xs font-semibold text-txt\">Up next</p>\n {upNext.length === 0 && <p className=\"text-xs text-muted\">Nothing is ready right now.</p>}\n {upNext.map(({ task, on }) => (\n <button\n key={task.id}\n type=\"button\"\n onClick={() => onOpenTask(task)}\n className={cn(\n \"flex flex-col gap-1.5 rounded-lg border border-border bg-surface px-[11px] py-[9px] text-left transition-colors duration-(--duration-fast) ease-out-soft hover:border-border2\",\n on && \"opacity-90\",\n RING,\n )}\n >\n <span className={cn(\"flex items-center gap-1.5 text-xs\", on ? \"text-muted\" : \"text-txt\")}>\n <StatusIcon status={task.status} />\n <span className=\"font-mono text-[11px] text-muted\">{task.id}</span>\n {on ? <>Waiting on <span className=\"font-mono\">{on}</span></> : \"Ready\"}\n </span>\n <span className=\"text-[13px] font-medium text-txt\">{task.title}</span>\n </button>\n ))}\n <p className=\"mt-1.5 text-[11px] leading-normal text-muted\">\n Same order as <span className=\"font-mono\">vibedoc_next_task</span>: a task is ready when everything it depends on is done.\n </p>\n </aside>\n </div>\n )\n}\n\nfunction Progress({ tasks }: { tasks: Task[] }) {\n const done = tasks.filter(t => t.status === \"done\").length\n return (\n <span className=\"shrink-0 font-mono text-[11px] text-muted\">\n <span className=\"text-txt\">{done}</span>/{tasks.length}\n </span>\n )\n}\n\nfunction DoneLine({ group, onExpand }: { group: TaskGroup; onExpand: () => void }) {\n return (\n <button\n type=\"button\"\n aria-expanded={false}\n onClick={onExpand}\n className={cn(\n \"flex h-10 items-center gap-3 rounded-lg border border-border bg-surface px-4 text-left transition-colors duration-(--duration-fast) ease-out-soft hover:bg-surface2\",\n RING,\n )}\n >\n <ChevronRight className=\"size-3.5 shrink-0 text-muted\" aria-hidden />\n {group.epicId && <span className=\"font-mono text-[11px] text-muted\">{group.epicId}</span>}\n <span className=\"min-w-0 truncate text-sm font-medium text-muted\">{group.label}</span>\n <span className=\"flex-1\" />\n <StatusIcon status=\"done\" />\n <Progress tasks={group.tasks} />\n </button>\n )\n}\n\nfunction EpicSection({\n group, status, collapsible, onCollapse, firstReady, agentTasks, onOpenTask,\n}: {\n group: TaskGroup\n status: TaskStatus\n collapsible: boolean\n onCollapse: () => void\n firstReady: Set<string>\n agentTasks: Set<string>\n onOpenTask: (task: Task) => void\n}) {\n const outline = useMemo(() => depOutline(group.tasks), [group.tasks])\n const meta = STATUS_META[status]\n const marks = [...group.tasks].sort(byId)\n\n return (\n <section className=\"flex flex-col gap-2.5 rounded-lg border border-border bg-surface px-3.5 pt-3.5 pb-2.5\">\n <div className=\"flex flex-wrap items-baseline gap-x-3 gap-y-1 px-0.5\">\n {group.epicId && <span className=\"font-mono text-[11px] text-muted\">{group.epicId}</span>}\n <h2 className=\"m-0 min-w-0 text-[1.1rem] font-semibold text-txt\">{group.label}</h2>\n <span className={cn(\"inline-flex items-center gap-1.5 self-center text-xs\", meta.text)}>\n <StatusIcon status={status} />\n {meta.label}\n </span>\n <span className=\"flex-1\" />\n <Progress tasks={group.tasks} />\n {collapsible && (\n <button\n type=\"button\"\n aria-expanded\n onClick={onCollapse}\n className={cn(\"self-center rounded-sm text-xs text-muted hover:text-txt\", RING)}\n >\n Collapse\n </button>\n )}\n </div>\n\n <div className=\"flex gap-[3px] px-0.5\" aria-hidden>\n {marks.map(t => (\n <span key={t.id} className={cn(\"h-[5px] flex-1 rounded-full\", MARK_BG[t.status])} />\n ))}\n </div>\n\n <ul className=\"flex flex-col\">\n {outline.map(({ task, depth, alsoAfter }) => {\n const done = task.status === \"done\"\n const size = sizeOf(task)\n return (\n <li key={task.id}>\n <button\n type=\"button\"\n onClick={() => onOpenTask(task)}\n style={{ paddingLeft: 16 + depth * 26 }}\n className={cn(\n \"relative flex h-[38px] w-full items-center gap-2.5 rounded-md pr-3 text-left transition-colors duration-(--duration-fast) ease-out-soft hover:bg-surface2\",\n RING,\n )}\n >\n {depth > 0 && (\n <span\n aria-hidden\n style={{ left: 2 + depth * 26 }}\n className=\"absolute top-0 bottom-1/2 w-2.5 rounded-bl-md border-b border-l border-border2\"\n />\n )}\n <StatusIcon status={task.status} />\n <span className=\"font-mono text-[11px] text-muted\">{task.id}</span>\n <span className={cn(\"min-w-0 truncate text-[13.5px] font-medium\", done ? \"text-muted\" : \"text-txt\")}>\n {task.title}\n </span>\n {alsoAfter.length > 0 && (\n <span className=\"hidden shrink-0 font-mono text-[10px] text-muted sm:inline\">\n also after {alsoAfter.join(\", \")}\n </span>\n )}\n {firstReady.has(task.id) && (\n <span className=\"inline-flex h-5 shrink-0 items-center gap-1 rounded-sm border border-accent px-[7px] text-[11px] text-txt\">\n <Play className=\"size-2.5 text-accent\" aria-hidden />\n Ready · next for the agent\n </span>\n )}\n {agentTasks.has(task.id) && (\n <span className=\"inline-flex shrink-0 items-center gap-1 text-[11px] text-txt\">\n <Bot className=\"size-3 text-accent\" aria-hidden />\n working\n </span>\n )}\n <span className=\"flex-1\" />\n {size && <span className=\"font-mono text-[10px] text-muted\">{size}</span>}\n </button>\n </li>\n )\n })}\n </ul>\n </section>\n )\n}\n","\"use client\"\n\nimport { useEffect, useMemo, useRef, useState } from \"react\"\nimport { cn } from \"@/lib/utils\"\nimport { STATUS_META } from \"@/components/shared/StatusIcon\"\nimport type { ActivityEvent, Task } from \"@/types\"\nimport {\n depOutline, foldAxis, groupTasks, timelineBars,\n type AxisSegment, type TimelineBar, type TimelineScale, type ViewState,\n} from \"@/lib/board-views\"\n\ninterface ViewProps {\n tasks: Task[]\n allTasks: Task[]\n state: ViewState\n agentTasks: Set<string>\n onOpenTask: (task: Task) => void\n}\n\nexport interface TimelineViewProps extends ViewProps {\n events: ActivityEvent[]\n loading: boolean\n onScale: (s: TimelineScale) => void\n}\n\nconst MIN = 60_000\nconst HOUR = 60 * MIN\nconst DAY = 24 * HOUR\nconst FOLD_GAP = 30 * MIN\nconst FOLD_W = 56\nconst SEG_MIN_W = 170\nconst ACTIVE_PX_PER_MIN = 2.2\n/** Sticky lane-label gutter: --gw is 110px on phones, 220px from sm up. */\nconst GUTTER = \"[--gw:110px] sm:[--gw:220px]\"\nconst ROW_H = 20\nconst LANE_PAD = 10\nconst HEAD_H = 28\nconst TRAIL_W = 200\n\nconst SCALES: { value: TimelineScale; label: string }[] = [\n { value: \"active\", label: \"Active time\" },\n { value: \"day\", label: \"Day\" },\n { value: \"week\", label: \"Week\" },\n]\n\n/** A laid-out axis stretch: [startMs, endMs] drawn at x … x + width. */\ninterface Seg extends AxisSegment { x: number; width: number }\n\nconst hm = (ms: number) => new Date(ms).toLocaleTimeString(\"en-GB\", { hour: \"2-digit\", minute: \"2-digit\", hour12: false })\nconst md = (ms: number) => new Date(ms).toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" })\nconst startOfDay = (ms: number) => { const d = new Date(ms); d.setHours(0, 0, 0, 0); return d.getTime() }\n\nfunction gapLabel(ms: number) {\n const m = Math.round(ms / MIN)\n if (m < 60) return `${m}m`\n const h = Math.floor(m / 60)\n if (h >= 24) return `${Math.round(m / 60)}h`\n return m % 60 ? `${h}h ${m % 60}m` : `${h}h`\n}\n\nfunction segLabel(s: AxisSegment) {\n return md(s.startMs) === md(s.endMs)\n ? `${md(s.startMs)} · ${hm(s.startMs)}–${hm(s.endMs)}`\n : `${md(s.startMs)} ${hm(s.startMs)} – ${md(s.endMs)} ${hm(s.endMs)}`\n}\n\n/** `**Due:** YYYY-MM-DD` is a local calendar date: build it from parts, never `new Date(\"YYYY-MM-DD\")`. */\nfunction dueMs(due: string | null) {\n const m = due?.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/)\n return m ? new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3])).getTime() : null\n}\n\nfunction layoutAxis(bars: TimelineBar[], scale: TimelineScale, now: number): Seg[] {\n if (!bars.length) return []\n if (scale === \"active\") {\n let x = 0\n return foldAxis(bars, FOLD_GAP).map((s, i) => {\n if (i > 0) x += FOLD_W\n const width = Math.max(SEG_MIN_W, ((s.endMs - s.startMs) / MIN) * ACTIVE_PX_PER_MIN)\n const seg = { ...s, x, width }\n x += width\n return seg\n })\n }\n const lo = Math.min(...bars.map((b) => b.startMs))\n const hi = Math.max(...bars.map((b) => b.endMs), bars.some((b) => b.open) ? now : 0)\n const startMs = startOfDay(lo)\n const endMs = startOfDay(hi) + DAY\n const pxPerMs = scale === \"day\" ? 40 / HOUR : 120 / DAY\n return [{ startMs, endMs, x: 0, width: (endMs - startMs) * pxPerMs }]\n}\n\n/** Pixel x for a moment, or null when it falls outside the axis (e.g. inside a folded gap). */\nfunction xAt(segs: Seg[], ms: number): number | null {\n for (const s of segs) {\n if (ms >= s.startMs && ms <= s.endMs) {\n const span = s.endMs - s.startMs || 1\n return s.x + ((ms - s.startMs) / span) * s.width\n }\n }\n return null\n}\n\nfunction ticks(segs: Seg[], scale: TimelineScale): { x: number; label: string | null }[] {\n const out: { x: number; label: string | null }[] = []\n for (const s of segs) {\n const dur = s.endMs - s.startMs\n const step = scale === \"week\" ? DAY : scale === \"day\" ? 6 * HOUR : dur <= 3 * HOUR ? 30 * MIN : dur <= 8 * HOUR ? HOUR : 3 * HOUR\n // Day/week ticks start at local midnight; active ticks at the first round step inside the segment.\n const first = scale === \"active\" ? Math.ceil(s.startMs / step) * step : s.startMs\n for (let t = first; t <= s.endMs; t += step) {\n const x = xAt([s], t)\n if (x == null) continue\n out.push({ x, label: scale === \"week\" ? md(t) : scale === \"day\" ? (hm(t) === \"00:00\" ? md(t) : hm(t)) : null })\n }\n }\n return out\n}\n\nfunction useNow(intervalMs = 30_000) {\n const [now, setNow] = useState(() => Date.now())\n useEffect(() => {\n const id = setInterval(() => setNow(Date.now()), intervalMs)\n return () => clearInterval(id)\n }, [intervalMs])\n return now\n}\n\nexport default function TimelineView({ tasks, state, agentTasks, onOpenTask, events, loading, onScale }: TimelineViewProps) {\n const now = useNow()\n const scale = state.scale\n\n const bars = useMemo(() => timelineBars(tasks, events, now), [tasks, events, now])\n const segs = useMemo(() => layoutAxis(bars, scale, now), [bars, scale, now])\n const tickList = useMemo(() => ticks(segs, scale), [segs, scale])\n const lanes = useMemo(() => {\n const barBy = new Map(bars.map((b) => [b.taskId, b]))\n return groupTasks(tasks, state.group).map((g) => {\n const worked = g.tasks.filter((t) => barBy.has(t.id))\n .map((t) => ({ task: t, bar: barBy.get(t.id) as TimelineBar }))\n .sort((a, b) => a.bar.startMs - b.bar.startMs)\n const openTasks = g.tasks.filter((t) => !barBy.has(t.id) && t.status !== \"done\" && t.status !== \"cancelled\")\n const planned = depOutline(openTasks).map((o) => o.task)\n // A finished epic's bars share one compact row (no labels; the bar titles carry them).\n const compact = !planned.length && g.tasks.every((t) => t.status === \"done\" || t.status === \"cancelled\")\n return { group: g, worked, planned, compact }\n }).filter((l) => l.worked.length || l.planned.length)\n }, [tasks, bars, state.group])\n\n const axisW = segs.length ? segs[segs.length - 1].x + segs[segs.length - 1].width : 0\n const canvasW = axisW + TRAIL_W\n const nowX = xAt(segs, now)\n const lastSegX = segs.length ? segs[segs.length - 1].x : null\n\n // Once per scale, bring the now line into view, or the latest work when now is past the axis.\n const scrollRef = useRef<HTMLDivElement>(null)\n const scrolledFor = useRef<TimelineScale | null>(null)\n useEffect(() => {\n const el = scrollRef.current\n if (!el || lastSegX == null || scrolledFor.current === scale) return\n scrolledFor.current = scale\n const gutter = el.querySelector<HTMLElement>(\"[data-gutter]\")?.offsetWidth ?? 0\n // No now line: show the latest segment from its start (on a phone it is wider than the view)\n el.scrollLeft = nowX != null ? nowX - (el.clientWidth - gutter) / 2 : Math.min(el.scrollWidth - el.clientWidth, lastSegX - 16)\n }, [nowX, scale, lastSegX])\n\n const scaleControl = (\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-xs text-muted max-sm:hidden\">Scale</span>\n <div role=\"group\" aria-label=\"Timeline scale\" className=\"flex rounded-md border border-border p-0.5\">\n {SCALES.map((s) => (\n <button\n key={s.value}\n type=\"button\"\n aria-pressed={scale === s.value}\n onClick={() => onScale(s.value)}\n className={cn(\n \"h-6 rounded-[5px] border border-transparent px-2.5 text-xs font-medium text-muted outline-none transition-colors duration-(--duration-fast) ease-out-soft\",\n \"hover:bg-surface2 hover:text-txt focus-visible:ring-2 focus-visible:ring-accent\",\n scale === s.value && \"border-border2 bg-surface2 text-txt\",\n )}\n >\n {s.label}\n </button>\n ))}\n </div>\n {scale === \"active\" && <span className=\"ml-2 text-xs text-muted max-sm:hidden\">Idle gaps folded</span>}\n </div>\n )\n\n if (!tasks.length) {\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex justify-end\">{scaleControl}</div>\n <div className=\"rounded-lg border border-dashed border-border px-6 py-10 text-center\">\n <p className=\"text-sm text-txt\">No tasks match these filters.</p>\n <p className=\"mt-1 text-xs text-muted\">Clear a filter or the search to see more of the timeline.</p>\n </div>\n </div>\n )\n }\n\n if (loading && !events.length) {\n return (\n <div className=\"flex flex-col gap-4\" aria-busy=\"true\" aria-label=\"Loading timeline\">\n <div className=\"flex justify-end\">{scaleControl}</div>\n {[0, 1, 2].map((i) => (\n <div key={i} className=\"flex gap-4 border-b border-border pb-4\">\n <div className=\"h-9 w-[200px] animate-pulse rounded bg-surface2\" />\n <div className=\"flex flex-1 flex-col gap-1.5 pt-1\">\n <div className=\"h-3.5 w-1/3 animate-pulse rounded-sm bg-surface2\" style={{ marginLeft: `${10 + i * 15}%` }} />\n <div className=\"h-3.5 w-1/5 animate-pulse rounded-sm bg-surface2\" style={{ marginLeft: `${30 + i * 10}%` }} />\n </div>\n </div>\n ))}\n </div>\n )\n }\n\n const hasDue = tasks.some((t) => t.due)\n\n return (\n <div className=\"flex min-w-0 flex-col gap-3\">\n <div className=\"flex justify-end\">{scaleControl}</div>\n\n {!bars.length && (\n <p className=\"text-sm text-muted\">\n No task moves in the activity log yet — bars appear once tasks move to In progress.\n </p>\n )}\n\n <div ref={scrollRef} className=\"min-w-0 overflow-x-auto overscroll-x-contain\">\n <div className={cn(\"relative\", GUTTER)} style={{ width: `calc(var(--gw) + ${canvasW}px)` }}>\n {/* Axis header */}\n <div className=\"flex\" style={{ height: HEAD_H + 8 }}>\n <div data-gutter className=\"sticky left-0 z-20 w-(--gw) shrink-0 bg-bg\" />\n <div className=\"relative\" style={{ width: canvasW }}>\n {segs.map((s, i) => (\n <div key={s.startMs}>\n {scale === \"active\" && (\n <div\n className=\"absolute bottom-0 truncate border-b border-border2 font-mono text-[11px] text-txt\"\n style={{ left: s.x, width: s.width, height: HEAD_H }}\n >\n {segLabel(s)}\n </div>\n )}\n {scale === \"active\" && i > 0 && (\n <span\n className=\"absolute bottom-0 flex justify-center font-mono text-[10px] whitespace-nowrap text-muted\"\n style={{ left: s.x - FOLD_W, width: FOLD_W, height: HEAD_H }}\n title={`Idle gap of ${gapLabel(s.startMs - segs[i - 1].endMs)} folded`}\n >\n {gapLabel(s.startMs - segs[i - 1].endMs)}\n </span>\n )}\n </div>\n ))}\n {scale !== \"active\" && segs.length > 0 && (\n <div className=\"absolute bottom-0 border-b border-border2\" style={{ left: 0, width: axisW, height: HEAD_H }}>\n {tickList.map((t) => t.label && (\n <span key={t.x} className=\"absolute top-0 pl-1 font-mono text-[11px] whitespace-nowrap text-txt\" style={{ left: t.x }}>\n {t.label}\n </span>\n ))}\n </div>\n )}\n {nowX != null && (\n <span\n className=\"absolute top-0 z-10 -translate-x-1/2 rounded bg-accent px-1.5 py-0.5 font-mono text-[10px] text-accent-fg\"\n style={{ left: nowX }}\n >\n {hm(now)}\n </span>\n )}\n </div>\n </div>\n\n {/* Lanes */}\n {lanes.map(({ group, worked, planned, compact }, laneIndex) => {\n const rows = compact ? 1 : worked.length + planned.length\n const height = Math.max(52, rows * ROW_H + LANE_PAD * 2)\n const lastEnd = worked.reduce<number | null>((max, w) => {\n const x = xAt(segs, w.bar.endMs)\n return x == null ? max : Math.max(max ?? 0, x)\n }, null)\n const plannedX = (lastEnd ?? nowX ?? 0) + 8\n return (\n <section key={group.key} className=\"flex border-b border-border\" aria-label={group.epicId ? `${group.epicId} ${group.label}` : group.label}>\n <div className=\"sticky left-0 z-20 flex w-(--gw) shrink-0 flex-col gap-0.5 bg-bg py-2.5 pr-2 sm:pr-4\">\n {group.epicId && <span className=\"font-mono text-[11px] text-muted\">{group.epicId}</span>}\n <span className=\"line-clamp-2 text-[13px] leading-tight font-semibold text-txt sm:line-clamp-none\" title={group.label}>{group.label}</span>\n </div>\n <div className=\"relative\" style={{ width: canvasW, height }}>\n {tickList.map((t) => (\n <span key={t.x} aria-hidden className=\"absolute inset-y-0 w-px bg-border opacity-60\" style={{ left: t.x }} />\n ))}\n {scale === \"active\" && segs.slice(1).map((s) => (\n <span key={s.startMs} aria-hidden className=\"absolute inset-y-0 border-l border-dashed border-border2\" style={{ left: s.x - FOLD_W / 2 }} />\n ))}\n {nowX != null && <span aria-hidden className=\"absolute inset-y-0 z-10 w-px bg-accent\" style={{ left: nowX }} />}\n\n {worked.map(({ task, bar }, i) => {\n const x0 = xAt(segs, bar.startMs) ?? 0\n const x1 = xAt(segs, bar.endMs) ?? x0\n const w = Math.max(4, x1 - x0)\n const top = LANE_PAD + (compact ? 0 : i) * ROW_H\n const agent = agentTasks.has(task.id)\n const live = bar.open && bar.status === \"in-progress\"\n const label = live\n ? `${task.id} · in progress since ${hm(bar.startMs)}`\n : bar.open\n ? `${task.id} · ${STATUS_META[bar.status].label.toLowerCase()}, first moved ${md(bar.startMs)} ${hm(bar.startMs)}`\n : `${task.id} · worked ${md(bar.startMs)} ${hm(bar.startMs)}–${hm(bar.endMs)}`\n const due = dueMs(task.due)\n const dueX = due == null ? null : xAt(segs, due)\n return (\n <div key={task.id}>\n <button\n type=\"button\"\n title={`${label} — ${task.title}`}\n aria-label={`${label} — ${task.title}`}\n onClick={() => onOpenTask(task)}\n className={cn(\n \"absolute h-3.5 origin-left animate-grow-x rounded-[3px] outline-none transition-opacity duration-(--duration-fast) ease-out-soft hover:opacity-80\",\n \"focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-1 focus-visible:ring-offset-bg\",\n live ? \"bg-amber\" : bar.status === \"done\" ? \"bg-teal\" : \"bg-border2\",\n )}\n // Worked time draws in from its start, one lane after another (capped at 240ms)\n style={{ left: x0, width: w, top: top + 3, animationDelay: `${Math.min(laneIndex * 40, 240)}ms` }}\n />\n {!compact && (\n <span\n className={cn(\"pointer-events-none absolute font-mono text-[10px] leading-[14px] whitespace-nowrap\", live ? \"text-txt\" : \"text-muted\")}\n style={{ left: x0 + w + 6, top: top + 3 }}\n >\n {task.id}{live && (agent ? \" · agent working\" : \" · in progress\")}\n </span>\n )}\n {dueX != null && <DueMark x={dueX} top={top + 3} due={task.due} />}\n </div>\n )\n })}\n\n {planned.map((task, i) => {\n const top = LANE_PAD + (worked.length + i) * ROW_H\n return (\n <button\n key={task.id}\n type=\"button\"\n onClick={() => onOpenTask(task)}\n title={`${task.id} · planned — ${task.title}`}\n aria-label={`${task.id} · planned — ${task.title}`}\n className=\"group absolute flex items-center gap-1.5 rounded-sm outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n style={{ left: plannedX, top: top + 3 }}\n >\n <span aria-hidden className=\"h-3.5 w-6 rounded-[3px] border border-dashed border-muted transition-colors duration-(--duration-fast) group-hover:border-txt\" />\n <span className=\"font-mono text-[10px] leading-[14px] whitespace-nowrap text-txt\">{task.id} · planned</span>\n </button>\n )\n })}\n </div>\n </section>\n )\n })}\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-2 text-[11px] text-muted\">\n <span className=\"flex items-center gap-1.5\"><span aria-hidden className=\"h-2 w-[18px] rounded-sm bg-teal\" />Worked: first move to In progress → Done (activity log)</span>\n <span className=\"flex items-center gap-1.5\"><span aria-hidden className=\"h-2 w-[18px] rounded-sm bg-amber\" />In progress now</span>\n <span className=\"flex items-center gap-1.5\"><span aria-hidden className=\"h-2 w-[18px] rounded-sm border border-dashed border-muted\" />Planned: queued in dependency order</span>\n <span className=\"flex items-center gap-1.5\"><span aria-hidden className=\"size-2.5 rotate-45 border border-txt\" />{hasDue ? \"Due date\" : \"Due date (none set in these tasks)\"}</span>\n </div>\n </div>\n )\n}\n\nfunction DueMark({ x, top, due }: { x: number; top: number; due: string | null }) {\n return (\n <span\n role=\"img\"\n aria-label={`Due ${due}`}\n title={`Due ${due}`}\n className=\"absolute size-2.5 -translate-x-1/2 rotate-45 border border-txt bg-bg\"\n style={{ left: x, top: top + 2 }}\n />\n )\n}\n","\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport { ChevronUp, FolderInput, Trash2, X } from \"lucide-react\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { StatusIcon } from \"@/components/shared/StatusIcon\"\nimport { useStatusDefs } from \"@/components/shared/status-defs\"\nimport { toast, undoToast } from \"@/components/ui/toast\"\nimport { useApp } from \"@/context/AppContext\"\nimport type { RoadmapItem, Task } from \"@/types\"\nimport { useItemCommands } from \"@/components/shared/item-commands\"\n\n\nasync function post<T>(url: string, body: unknown): Promise<T> {\n const res = await fetch(url, { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify(body) })\n const json = await res.json().catch(() => null)\n if (!res.ok) throw new Error(json?.error ?? `Request failed (${res.status})`)\n return json as T\n}\n\nconst pill = \"inline-flex h-8 items-center gap-1.5 rounded-md px-2.5 text-xs text-txt hover:bg-surface transition-colors\"\n\n/** Floating bar for the selected tasks: status, epic, delete (one request, one refresh). */\nexport function BulkBar({ ids, onClear }: { ids: string[]; onClear: () => void }) {\n const { rootParam } = useApp()\n const [epics, setEpics] = useState<RoadmapItem[]>([])\n const [busy, setBusy] = useState(false)\n const [statusOpen, setStatusOpen] = useState(false)\n const defs = useStatusDefs()\n\n useEffect(() => {\n fetch(`/api/roadmap${rootParam}`)\n .then((r) => (r.ok ? r.json() : null))\n .then((d: { items?: RoadmapItem[] } | null) => setEpics((d?.items ?? []).filter((i) => i.parent !== null && i.status !== \"done\")))\n .catch(() => setEpics([]))\n }, [rootParam])\n\n async function run(action: unknown, after?: (r: { deleted: { task: Task; links: unknown[] }[] }) => void) {\n setBusy(true)\n try {\n const r = await post<{ deleted: { task: Task; links: unknown[] }[] }>(`/api/tasks/bulk${rootParam}`, { ids, action })\n onClear()\n after?.(r)\n } catch (e) {\n toast((e as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n const remove = () => run({ delete: true }, ({ deleted }) => {\n undoToast(`Deleted ${deleted.length} task${deleted.length === 1 ? \"\" : \"s\"}`, async () => {\n // Reverse order: each delete recorded its index after the earlier ones were already gone\n for (const { task, links } of [...deleted].reverse()) {\n await post(`/api/tasks/restore${rootParam}`, { file: task.file, raw: task.raw, links })\n }\n })\n })\n\n useItemCommands(`${ids.length} selected task${ids.length === 1 ? \"\" : \"s\"}`, [\n { action: \"status\", label: \"Change status…\", run: () => setStatusOpen(true) },\n { action: \"remove\", label: `Delete ${ids.length} task${ids.length === 1 ? \"\" : \"s\"}`, run: remove },\n ])\n\n return (\n <div\n role=\"toolbar\"\n aria-label=\"Bulk actions\"\n className=\"fixed bottom-6 left-1/2 z-50 flex -translate-x-1/2 animate-slide-in items-center gap-1 rounded-lg border border-border bg-surface2 p-1 pl-3 shadow-xl\"\n >\n <span className=\"mr-1 font-mono text-xs tabular-nums text-txt\">{ids.length} selected</span>\n <DropdownMenu open={statusOpen} onOpenChange={setStatusOpen}>\n <DropdownMenuTrigger asChild>\n <button type=\"button\" disabled={busy} className={pill}>Status <ChevronUp className=\"size-3.5 text-muted\" /></button>\n </DropdownMenuTrigger>\n <DropdownMenuContent side=\"top\" className=\"w-44\">\n {defs.map((d) => (\n <DropdownMenuItem key={d.id} onSelect={() => run({ status: d.id })}>\n <StatusIcon status={d.id} /> {d.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button type=\"button\" disabled={busy} className={pill}><FolderInput className=\"size-3.5 text-muted\" /> Epic <ChevronUp className=\"size-3.5 text-muted\" /></button>\n </DropdownMenuTrigger>\n <DropdownMenuContent side=\"top\" className=\"max-h-72 w-64 overflow-y-auto\">\n {epics.map((e) => (\n <DropdownMenuItem key={e.id} onSelect={() => run({ epic: e.id })}>\n <span className=\"font-mono text-[11px] text-muted\">{e.id}</span> <span className=\"truncate\">{e.title}</span>\n </DropdownMenuItem>\n ))}\n {epics.length > 0 && <DropdownMenuSeparator />}\n <DropdownMenuItem onSelect={() => run({ epic: null })}>No epic</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n <button type=\"button\" disabled={busy} onClick={remove} className={`${pill} text-danger hover:text-danger`}>\n <Trash2 className=\"size-3.5\" /> Delete\n </button>\n <button type=\"button\" aria-label=\"Clear selection\" onClick={onClear} className=\"grid size-8 place-items-center rounded-md text-muted hover:bg-surface hover:text-txt\">\n <X className=\"size-4\" />\n </button>\n </div>\n )\n}\n","\"use client\"\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\"\nimport { useSearchParams } from \"next/navigation\"\nimport { Plus } from \"lucide-react\"\nimport type { ActivityEvent, Task } from \"@/types\"\nimport { useApp } from \"@/context/AppContext\"\nimport { useChats } from \"@/context/ChatContext\"\nimport { shouldHandleShortcut } from \"@/lib/shortcuts\"\nimport {\n DEFAULT_VIEWS, applyView, epicOf, fromParams, isDirty, toParams, type SavedView, type ViewState,\n} from \"@/lib/board-views\"\nimport { ViewBar } from \"./views/ViewBar\"\nimport { ViewToolbar } from \"./views/ViewToolbar\"\nimport { BoardView } from \"./views/BoardView\"\nimport { TableView } from \"./views/TableView\"\nimport { EpicView } from \"./views/EpicView\"\nimport TimelineView from \"./views/TimelineView\"\nimport { BulkBar } from \"./BulkBar\"\n\ninterface BoardTabProps {\n tasks: Task[]\n onMoveTask: (id: string, status: string) => void\n onOpenTask: (task: Task) => void\n onNewTask: () => void\n}\n\nconst BUILT_IN = DEFAULT_VIEWS.map((v) => v.id)\n/** URL keys that carry view state (toParams / fromParams); `v` names the active saved view. */\nconst STATE_KEYS = [\"view\", \"g\", \"sg\", \"s\", \"f\", \"q\", \"p\", \"sc\"]\nconst SEARCH_ID = \"board-search\"\n\nconst stateOf = ({ id: _id, name: _name, ...s }: SavedView): ViewState => s\nconst slug = (name: string) => name.toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\").slice(0, 30) || \"view\"\nconst newId = (name: string) => `${slug(name)}-${Math.random().toString(36).slice(2, 6)}`\n\n/** Built-ins first (a saved copy replaces the default), then custom views in saved order. */\nfunction withBuiltIns(saved: SavedView[]): SavedView[] {\n const byId = new Map(saved.map((v) => [v.id, v]))\n return [...DEFAULT_VIEWS.map((d) => byId.get(d.id) ?? d), ...saved.filter((v) => !BUILT_IN.includes(v.id))]\n}\n\n/** A built-in that differs from its code default (so it is saved, and can be restored). */\nfunction customized(v: SavedView): boolean {\n const d = DEFAULT_VIEWS.find((x) => x.id === v.id)\n return !!d && (v.name !== d.name || isDirty(stateOf(v), d))\n}\n\nexport function BoardTab({ tasks, onMoveTask, onOpenTask, onNewTask }: BoardTabProps) {\n const { rootParam } = useApp()\n const { agents } = useChats()\n const params = useSearchParams()\n const [views, setViews] = useState<SavedView[]>(DEFAULT_VIEWS)\n const [filterOpen, setFilterOpen] = useState(false)\n const [events, setEvents] = useState<ActivityEvent[]>([])\n const [eventsLoading, setEventsLoading] = useState(false)\n const [picked, setPicked] = useState<Set<string>>(new Set())\n\n // ── Saved views (.vibedoc/views.json) ───────────────────────────────────────\n const loadViews = useCallback(() => {\n fetch(`/api/views${rootParam}`)\n .then((r) => (r.ok ? r.json() : Promise.reject(new Error(`HTTP ${r.status}`))))\n .then((d: { views?: SavedView[] }) => setViews(withBuiltIns(d.views ?? [])))\n .catch((e) => console.warn(\"[vibedoc] could not load views:\", e))\n }, [rootParam])\n useEffect(() => {\n loadViews()\n const onSse = (e: Event) => { if ((e as CustomEvent<{ type?: string }>).detail?.type === \"views_updated\") loadViews() }\n window.addEventListener(\"vibedoc:sse\", onSse)\n return () => window.removeEventListener(\"vibedoc:sse\", onSse)\n }, [loadViews])\n\n // Unchanged built-ins stay out of views.json so later changes to DEFAULT_VIEWS still reach this project.\n const persist = useCallback((next: SavedView[]) => {\n setViews(next)\n const body = { views: next.filter((v) => !BUILT_IN.includes(v.id) || customized(v)) }\n fetch(`/api/views${rootParam}`, { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify(body) })\n .then((r) => { if (!r.ok) throw new Error(`HTTP ${r.status}`) })\n .catch((e) => { console.warn(\"[vibedoc] could not save views:\", e); loadViews() })\n }, [rootParam, loadViews])\n\n // ── Live state = the URL. No view keys → the active saved view's state. ─────\n const vParam = params.get(\"v\")\n const explicit = STATE_KEYS.some((k) => params.has(k))\n const key = params.toString()\n // Keyed on the query string so `state` (and every view's memo on it) keeps its identity between URL changes.\n const urlState = useMemo(() => fromParams(new URLSearchParams(key)), [key])\n const active = views.find((v) => v.id === vParam) ?? views.find((v) => v.id === urlState.kind) ?? views[0]\n const state: ViewState = useMemo(() => (explicit ? urlState : stateOf(active)), [explicit, urlState, active])\n const dirty = isDirty(state, active)\n\n // Native replaceState syncs useSearchParams without a server round trip (search typing stays smooth).\n const writeUrl = useCallback((id: string, next: ViewState | null) => {\n const p = new URLSearchParams(window.location.search)\n for (const k of [...STATE_KEYS, \"v\"]) p.delete(k)\n p.set(\"v\", id)\n if (next) {\n const sp = toParams(next)\n // An empty set would read back as the saved view; name the kind so the default state sticks.\n if (![...sp.keys()].length) sp.set(\"view\", next.kind)\n sp.forEach((val, k) => p.set(k, val))\n }\n window.history.replaceState(null, \"\", `${window.location.pathname}?${p}`)\n }, [])\n\n const setState = (next: ViewState) => writeUrl(active.id, next)\n const select = useCallback((id: string) => {\n setFilterOpen(false)\n const nextKind = views.find((v) => v.id === id)?.kind\n const body = document.querySelector<HTMLElement>(\"[data-board-view]\")\n if (!nextKind || !body || !(\"startViewTransition\" in document)) { writeUrl(id, null); return }\n // The URL syncs into React asynchronously, so hold the transition until the new view is on screen (max 300ms)\n document.startViewTransition(() => new Promise<void>((resolve) => {\n const done = () => { observer.disconnect(); clearTimeout(timer); resolve() }\n const observer = new MutationObserver(() => { if (body.dataset.boardView === nextKind) done() })\n const timer = setTimeout(done, 300)\n observer.observe(body, { attributes: true, attributeFilter: [\"data-board-view\"] })\n writeUrl(id, null)\n if (body.dataset.boardView === nextKind) done()\n }))\n }, [writeUrl, views])\n\n const saveAs = (name: string) => {\n const id = newId(name)\n persist([...views, { ...state, q: \"\", id, name }])\n writeUrl(id, null)\n }\n const save = () => persist(views.map((v) => (v.id === active.id ? { ...state, q: \"\", id: v.id, name: v.name } : v)))\n const rename = (id: string, name: string) => persist(views.map((v) => (v.id === id ? { ...v, name } : v)))\n const restore = (id: string) => {\n const d = DEFAULT_VIEWS.find((x) => x.id === id)\n if (!d) return\n persist(views.map((v) => (v.id === id ? d : v)))\n writeUrl(id, null)\n }\n const remove = (id: string) => {\n const v = views.find((x) => x.id === id)\n if (!v || !window.confirm(`Delete the view \"${v.name}\"? Tasks are not affected.`)) return false\n persist(views.filter((x) => x.id !== id))\n if (active.id === id) writeUrl(v.kind, null)\n return true\n }\n\n // ── Data ────────────────────────────────────────────────────────────────────\n const agentTasks = useMemo(\n () => new Set(Object.keys(agents).filter((k) => k.startsWith(\"task:\")).map((k) => k.slice(5))),\n [agents],\n )\n const shown = useMemo(() => applyView(tasks, state, { agentTasks }), [tasks, state, agentTasks])\n const epics = useMemo(() => {\n const m = new Map<string, { id: string; title: string; open: boolean }>()\n for (const t of tasks) {\n const e = epicOf(t.phase)\n if (!e.id) continue\n const cur = m.get(e.id) ?? { id: e.id, title: e.title, open: false }\n if (!cur.title) cur.title = e.title\n if (t.status !== \"done\" && t.status !== \"cancelled\") cur.open = true\n m.set(e.id, cur)\n }\n return [...m.values()].sort((a, b) => a.id.localeCompare(b.id, undefined, { numeric: true }))\n }, [tasks])\n\n const timeline = state.kind === \"timeline\"\n useEffect(() => {\n if (!timeline) return\n let alive = true\n const load = () => {\n setEventsLoading(true)\n fetch(`/api/activity${rootParam}&limit=2000`)\n .then((r) => (r.ok ? r.json() : Promise.reject(new Error(`HTTP ${r.status}`))))\n .then((d: ActivityEvent[]) => { if (alive) setEvents(Array.isArray(d) ? d : []) })\n .catch((e) => console.warn(\"[vibedoc] could not load activity:\", e))\n .finally(() => { if (alive) setEventsLoading(false) })\n }\n const onSse = (e: Event) => {\n const type = (e as CustomEvent<{ type?: string }>).detail?.type\n if (type !== \"chat_saved\" && type !== \"views_updated\") load()\n }\n load()\n window.addEventListener(\"vibedoc:sse\", onSse)\n return () => { alive = false; window.removeEventListener(\"vibedoc:sse\", onSse) }\n }, [timeline, rootParam])\n\n // ── Keys (board page only): v next view, 1–4 built-ins, f filter, n new task ─\n const order = views.map((v) => v.id).join(\",\")\n const activeId = active.id\n useEffect(() => {\n function onKey(e: KeyboardEvent) {\n if (!shouldHandleShortcut(e) || document.querySelector(\"[role=dialog]\")) return\n const n = Number(e.key)\n const ids = order.split(\",\")\n if (e.key === \"v\") select(ids[(ids.indexOf(activeId) + 1) % ids.length])\n else if (n >= 1 && n <= 4) select(BUILT_IN[n - 1])\n else if (e.key === \"f\") setFilterOpen(true)\n else if (e.key === \"n\") onNewTask()\n else return\n e.preventDefault()\n }\n window.addEventListener(\"keydown\", onKey)\n return () => window.removeEventListener(\"keydown\", onKey)\n }, [order, activeId, select, onNewTask])\n\n // Only tasks still on screen count as selected (a filter or a delete drops the rest)\n const selected = useMemo(() => new Set(shown.map((t) => t.id).filter((id) => picked.has(id))), [shown, picked])\n const toggleSelect = useCallback((ids: string[], on?: boolean) => setPicked((prev) => {\n const next = new Set(prev)\n for (const id of ids) {\n if (on ?? !next.has(id)) next.add(id)\n else next.delete(id)\n }\n return next\n }), [])\n const clearSelection = useCallback(() => setPicked(new Set()), [])\n useEffect(() => {\n if (selected.size === 0) return\n const onKey = (e: KeyboardEvent) => { if (e.key === \"Escape\" && !document.querySelector(\"[role=dialog],[role=menu]\")) clearSelection() }\n window.addEventListener(\"keydown\", onKey)\n return () => window.removeEventListener(\"keydown\", onKey)\n }, [selected.size, clearSelection])\n\n const count = (...s: Task[\"status\"][]) => tasks.filter((t) => s.includes(t.status)).length\n const viewProps = { tasks: shown, allTasks: tasks, state, agentTasks, onOpenTask, selected, onToggleSelect: toggleSelect }\n\n return (\n <div className=\"flex min-w-0 flex-col\">\n <header className=\"flex items-end gap-6 px-4 pt-8 sm:px-8\">\n <div className=\"min-w-0 grow\">\n <h1 className=\"text-[1.6rem] leading-tight font-semibold tracking-[-0.02em] text-txt\">Board</h1>\n <p className=\"mt-2 text-[1.1rem] leading-snug font-semibold text-txt\">\n <span className=\"font-mono tabular-nums\">{count(\"todo\", \"in-progress\", \"review\", \"blocked\")}</span> open ·{\" \"}\n <span className=\"font-mono tabular-nums\">{count(\"in-progress\")}</span> in progress{\" \"}\n <span className=\"font-normal text-muted\">\n · <span className=\"font-mono tabular-nums\">{count(\"done\")}</span> done\n </span>\n </p>\n </div>\n <button\n type=\"button\"\n onClick={onNewTask}\n className=\"inline-flex h-8.5 shrink-0 items-center gap-1.5 whitespace-nowrap rounded-md bg-accent px-3 text-[13px] font-medium text-accent-fg transition-colors duration-(--duration-fast) ease-out-soft hover:bg-accent/90 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-bg\"\n >\n <Plus aria-hidden className=\"size-[15px]\" />\n New task\n <kbd className=\"rounded-sm border border-accent-fg/25 bg-accent-fg/15 px-1 py-0.5 font-mono text-[10px] leading-none max-sm:hidden\">n</kbd>\n </button>\n </header>\n\n <div className=\"mt-[18px] px-4 sm:px-8\">\n <ViewBar views={views} activeId={activeId} onSelect={select} onNew={() => saveAs(\"New view\")} onRename={rename} onDelete={remove}\n customizedIds={views.filter(customized).map((v) => v.id)} onRestore={restore} />\n </div>\n <div className=\"px-4 pt-3 sm:px-8\">\n <ViewToolbar\n state={state}\n onChange={setState}\n epics={epics}\n dirty={dirty}\n activeIsBuiltIn={BUILT_IN.includes(activeId)}\n onSave={save}\n onSaveAs={saveAs}\n onReset={() => select(activeId)}\n searchInputId={SEARCH_ID}\n filterOpen={filterOpen}\n onFilterOpenChange={setFilterOpen}\n />\n </div>\n\n <div data-board-view={state.kind} className=\"[view-transition-name:board-view-body]\">\n {state.kind === \"epic\" ? (\n <EpicView {...viewProps} />\n ) : (\n <div className=\"min-w-0 px-4 pt-[18px] pb-8 sm:px-8\">\n {state.kind === \"board\" && <BoardView {...viewProps} onMoveTask={onMoveTask} />}\n {state.kind === \"table\" && <TableView {...viewProps} onSort={(sorts) => setState({ ...state, sorts })} />}\n {timeline && (\n <TimelineView {...viewProps} events={events} loading={eventsLoading} onScale={(scale) => setState({ ...state, scale })} />\n )}\n </div>\n )}\n </div>\n {selected.size > 0 && <BulkBar ids={[...selected]} onClear={clearSelection} />}\n </div>\n )\n}\n","\"use client\"\n\nimport { useState, useEffect } from \"react\"\nimport * as Dialog from \"@radix-ui/react-dialog\"\nimport { X, Plus, Loader2 } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\n\ninterface NewTaskModalProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n rootParam: string\n onTaskCreated: () => void\n}\n\nconst SIZE_OPTIONS = [\n { value: \"XS (< 1 hr)\", label: \"XS — under 1 hr\" },\n { value: \"S (1-2 hrs)\", label: \"S — 1–2 hrs\" },\n { value: \"M (3-4 hrs)\", label: \"M — 3–4 hrs\" },\n { value: \"L (5-8 hrs)\", label: \"L — 5–8 hrs\" },\n { value: \"XL (> 1 day)\", label: \"XL — over a day\" },\n]\n\nexport function NewTaskModal({ open, onOpenChange, rootParam, onTaskCreated }: NewTaskModalProps) {\n const [title, setTitle] = useState(\"\")\n const [phase, setPhase] = useState(\"\")\n const [size, setSize] = useState(\"\")\n const [description, setDescription] = useState(\"\")\n const [dependsOn, setDependsOn] = useState(\"\")\n const [error, setError] = useState(\"\")\n const [creating, setCreating] = useState(false)\n\n useEffect(() => {\n if (open) {\n setTitle(\"\")\n setPhase(\"\")\n setSize(\"\")\n setDescription(\"\")\n setDependsOn(\"\")\n setError(\"\")\n setCreating(false)\n }\n }, [open])\n\n async function handleSubmit(e: React.FormEvent) {\n e.preventDefault()\n if (!title.trim()) { setError(\"Title is required\"); return }\n\n setCreating(true)\n setError(\"\")\n\n try {\n const res = await fetch(`/api/tasks/create${rootParam}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n title: title.trim(),\n phase: phase.trim() || undefined,\n size: size || undefined,\n description: description.trim() || undefined,\n dependsOn: dependsOn.trim() || undefined,\n }),\n })\n\n if (!res.ok) {\n const data = await res.json()\n setError(data.error ?? \"Failed to create task\")\n setCreating(false)\n return\n }\n\n setCreating(false)\n onTaskCreated()\n onOpenChange(false)\n } catch {\n setError(\"Network error — please try again\")\n setCreating(false)\n }\n }\n\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"fixed inset-0 z-50 bg-black/60\" />\n <Dialog.Content className=\"fixed z-50 top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-full max-w-lg bg-surface border border-border rounded-xl shadow-2xl\">\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-border\">\n <Dialog.Title className=\"font-semibold text-txt\">New Task</Dialog.Title>\n <Dialog.Close className=\"text-muted hover:text-txt transition-colors\">\n <X className=\"w-4 h-4\" />\n </Dialog.Close>\n </div>\n\n <form onSubmit={handleSubmit} className=\"p-5 space-y-4\">\n <div className=\"space-y-1.5\">\n <label className=\"block text-xs font-medium text-muted uppercase tracking-wide\">\n Title <span className=\"text-danger\">*</span>\n </label>\n <input\n autoFocus\n type=\"text\"\n value={title}\n onChange={e => setTitle(e.target.value)}\n placeholder=\"e.g. Add drag-and-drop to kanban\"\n className=\"w-full px-3 py-2 bg-surface2 border border-border rounded-lg text-sm text-txt placeholder:text-muted focus:outline-hidden focus:border-accent transition-colors\"\n />\n </div>\n\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"space-y-1.5\">\n <label className=\"block text-xs font-medium text-muted uppercase tracking-wide\">Phase</label>\n <input\n type=\"text\"\n value={phase}\n onChange={e => setPhase(e.target.value)}\n placeholder=\"e.g. 1 — Core\"\n className=\"w-full px-3 py-2 bg-surface2 border border-border rounded-lg text-sm text-txt placeholder:text-muted focus:outline-hidden focus:border-accent transition-colors\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"block text-xs font-medium text-muted uppercase tracking-wide\">Size</label>\n <select\n value={size}\n onChange={e => setSize(e.target.value)}\n className=\"w-full px-3 py-2 bg-surface2 border border-border rounded-lg text-sm text-txt focus:outline-hidden focus:border-accent transition-colors\"\n >\n <option value=\"\">—</option>\n {SIZE_OPTIONS.map(o => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n </div>\n </div>\n\n <div className=\"space-y-1.5\">\n <label className=\"block text-xs font-medium text-muted uppercase tracking-wide\">Depends on</label>\n <input\n type=\"text\"\n value={dependsOn}\n onChange={e => setDependsOn(e.target.value)}\n placeholder=\"e.g. T001, T003\"\n className=\"w-full px-3 py-2 bg-surface2 border border-border rounded-lg text-sm text-txt placeholder:text-muted focus:outline-hidden focus:border-accent transition-colors\"\n />\n </div>\n\n <div className=\"space-y-1.5\">\n <label className=\"block text-xs font-medium text-muted uppercase tracking-wide\">Description</label>\n <textarea\n value={description}\n onChange={e => setDescription(e.target.value)}\n placeholder=\"What needs to be built?\"\n rows={3}\n className=\"w-full px-3 py-2 bg-surface2 border border-border rounded-lg text-sm text-txt placeholder:text-muted focus:outline-hidden focus:border-accent transition-colors resize-none\"\n />\n </div>\n\n {error && (\n <p className=\"text-sm text-danger\">{error}</p>\n )}\n\n <div className=\"flex items-center justify-end gap-2 pt-1\">\n <Dialog.Close\n type=\"button\"\n className=\"px-4 py-2 text-sm text-muted hover:text-txt transition-colors\"\n >\n Cancel\n </Dialog.Close>\n <button\n type=\"submit\"\n disabled={creating || !title.trim()}\n className={cn(\n \"flex items-center gap-2 px-4 py-2 rounded-lg text-sm font-medium transition-colors\",\n \"bg-accent text-accent-fg hover:bg-accent/90 disabled:opacity-50 disabled:cursor-not-allowed\"\n )}\n >\n {creating ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Plus className=\"w-4 h-4\" />}\n {creating ? \"Creating…\" : \"Create Task\"}\n </button>\n </div>\n </form>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\n","\"use client\"\n\nimport { Suspense, useMemo, useState } from \"react\"\nimport { useRouter, useSearchParams } from \"next/navigation\"\nimport { useApp } from \"@/context/AppContext\"\nimport { BoardTab } from \"@/components/board/BoardTab\"\nimport { TaskDetailPanel } from \"@/components/board/TaskDetailPanel\"\nimport { NewTaskModal } from \"@/components/board/NewTaskModal\"\nimport type { Task } from \"@/types\"\n\nexport default function BoardPage() {\n return (\n <Suspense>\n <BoardPageInner />\n </Suspense>\n )\n}\n\nfunction BoardPageInner() {\n const { board, moveTask, refresh, rootParam } = useApp()\n const router = useRouter()\n const [selectedId, setSelectedId] = useState<string | null>(null)\n // ?task=T055 (links from a chat) opens that task; adjusted during render so a new link re-opens it\n const taskParam = useSearchParams().get(\"task\")\n const [seenTaskParam, setSeenTaskParam] = useState<string | null>(null)\n if (board && taskParam !== seenTaskParam) {\n setSeenTaskParam(taskParam)\n if (taskParam && Object.values(board).flat().some((t) => t.id === taskParam)) setSelectedId(taskParam)\n }\n const [newTaskOpen, setNewTaskOpen] = useState(false)\n // Drop only ?task=: the rest of the query is the live board view\n const closeTaskParam = () => {\n const p = new URLSearchParams(window.location.search)\n p.delete(\"task\")\n router.replace(p.size ? `/board?${p}` : \"/board\", { scroll: false })\n }\n\n const tasks = useMemo(() => (board ? Object.values(board).flat() : []), [board])\n // derived from the board so edits show live and a deleted task closes the panel\n const selectedTask = tasks.find((t) => t.id === selectedId) ?? null\n\n if (!board) return null\n\n return (\n <div className=\"relative min-w-0 flex-1\">\n <BoardTab\n tasks={tasks}\n onMoveTask={moveTask}\n onOpenTask={(t: Task) => setSelectedId(t.id)}\n onNewTask={() => setNewTaskOpen(true)}\n />\n <TaskDetailPanel\n task={selectedTask}\n onClose={() => { setSelectedId(null); if (taskParam) closeTaskParam() }}\n onMove={moveTask}\n />\n <NewTaskModal\n open={newTaskOpen}\n onOpenChange={setNewTaskOpen}\n rootParam={rootParam}\n onTaskCreated={refresh}\n />\n </div>\n )\n}\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'chevron-up',\n size: 24,\n node: [['path', { d: 'm18 15-6-6-6 6', key: '153udz' }]],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\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(__iconData);\n\nexport default ChevronUp;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'square-kanban',\n size: 24,\n node: [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', key: 'afitv7' }],\n ['path', { d: 'M8 7v7', key: '1x2jlm' }],\n ['path', { d: 'M12 7v4', key: 'xawao1' }],\n ['path', { d: 'M16 7v9', key: '1hp2iy' }],\n ],\n aliases: ['kanban-square'],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name SquareKanban\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiAvPgogIDxwYXRoIGQ9Ik04IDd2NyIgLz4KICA8cGF0aCBkPSJNMTIgN3Y0IiAvPgogIDxwYXRoIGQ9Ik0xNiA3djkiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/square-kanban\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 SquareKanban = createLucideIcon(__iconData);\n\nexport default SquareKanban;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'list-filter',\n size: 24,\n node: [\n ['path', { d: 'M2 5h20', key: '1fs1ex' }],\n ['path', { d: 'M6 12h12', key: '8npq4p' }],\n ['path', { d: 'M9 19h6', key: '456am0' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name ListFilter\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMiA1aDIwIiAvPgogIDxwYXRoIGQ9Ik02IDEyaDEyIiAvPgogIDxwYXRoIGQ9Ik05IDE5aDYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/list-filter\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 ListFilter = createLucideIcon(__iconData);\n\nexport default ListFilter;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'chart-gantt',\n size: 24,\n node: [\n ['path', { d: 'M10 6h8', key: 'zvc2xc' }],\n ['path', { d: 'M12 16h6', key: 'yi5mkt' }],\n ['path', { d: 'M3 3v16a2 2 0 0 0 2 2h16', key: 'c24i48' }],\n ['path', { d: 'M8 11h7', key: 'wz2hg0' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name ChartGantt\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAgNmg4IiAvPgogIDxwYXRoIGQ9Ik0xMiAxNmg2IiAvPgogIDxwYXRoIGQ9Ik0zIDN2MTZhMiAyIDAgMCAwIDIgMmgxNiIgLz4KICA8cGF0aCBkPSJNOCAxMWg3IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/chart-gantt\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 ChartGantt = createLucideIcon(__iconData);\n\nexport default ChartGantt;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'rows-3',\n size: 24,\n node: [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', key: 'afitv7' }],\n ['path', { d: 'M21 9H3', key: '1338ky' }],\n ['path', { d: 'M21 15H3', key: '9uk58r' }],\n ],\n aliases: ['panels-top-bottom'],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Rows3\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiAvPgogIDxwYXRoIGQ9Ik0yMSA5SDMiIC8+CiAgPHBhdGggZD0iTTIxIDE1SDMiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/rows-3\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 Rows3 = createLucideIcon(__iconData);\n\nexport default Rows3;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'sliders-horizontal',\n size: 24,\n node: [\n ['path', { d: 'M10 5H3', key: '1qgfaw' }],\n ['path', { d: 'M12 19H3', key: 'yhmn1j' }],\n ['path', { d: 'M14 3v4', key: '1sua03' }],\n ['path', { d: 'M16 17v4', key: '1q0r14' }],\n ['path', { d: 'M21 12h-9', key: '1o4lsq' }],\n ['path', { d: 'M21 19h-5', key: '1rlt1p' }],\n ['path', { d: 'M21 5h-7', key: '1oszz2' }],\n ['path', { d: 'M8 10v4', key: 'tgpxqk' }],\n ['path', { d: 'M8 12H3', key: 'a7s4jb' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name SlidersHorizontal\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAgNUgzIiAvPgogIDxwYXRoIGQ9Ik0xMiAxOUgzIiAvPgogIDxwYXRoIGQ9Ik0xNCAzdjQiIC8+CiAgPHBhdGggZD0iTTE2IDE3djQiIC8+CiAgPHBhdGggZD0iTTIxIDEyaC05IiAvPgogIDxwYXRoIGQ9Ik0yMSAxOWgtNSIgLz4KICA8cGF0aCBkPSJNMjEgNWgtNyIgLz4KICA8cGF0aCBkPSJNOCAxMHY0IiAvPgogIDxwYXRoIGQ9Ik04IDEySDMiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/sliders-horizontal\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 SlidersHorizontal = createLucideIcon(__iconData);\n\nexport default SlidersHorizontal;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'table-2',\n size: 24,\n node: [\n ['path', { d: 'M3 9h18', key: '1pudct' }],\n ['path', { d: 'M9 3v18', key: 'fh3hqa' }],\n ['rect', { x: '3', y: '3', width: '18', height: '18', rx: '2', key: 'h1oib' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Table2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyA5aDE4IiAvPgogIDxwYXRoIGQ9Ik05IDN2MTgiIC8+CiAgPHJlY3QgeD0iMyIgeT0iMyIgd2lkdGg9IjE4IiBoZWlnaHQ9IjE4IiByeD0iMiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/table-2\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 Table2 = createLucideIcon(__iconData);\n\nexport default Table2;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'corner-down-right',\n size: 24,\n node: [\n ['path', { d: 'm15 10 5 5-5 5', key: 'qqa56n' }],\n ['path', { d: 'M4 4v7a4 4 0 0 0 4 4h12', key: 'z08zvw' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name CornerDownRight\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTUgMTAgNSA1LTUgNSIgLz4KICA8cGF0aCBkPSJNNCA0djdhNCA0IDAgMCAwIDQgNGgxMiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/corner-down-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 CornerDownRight = createLucideIcon(__iconData);\n\nexport default CornerDownRight;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'panel-right-open',\n size: 24,\n node: [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', key: 'afitv7' }],\n ['path', { d: 'M15 3v18', key: '14nvp0' }],\n ['path', { d: 'm10 15-3-3 3-3', key: '1pgupc' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name PanelRightOpen\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiAvPgogIDxwYXRoIGQ9Ik0xNSAzdjE4IiAvPgogIDxwYXRoIGQ9Im0xMCAxNS0zLTMgMy0zIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/panel-right-open\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 PanelRightOpen = createLucideIcon(__iconData);\n\nexport default PanelRightOpen;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'bookmark',\n size: 24,\n node: [\n [\n 'path',\n {\n d: 'M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z',\n key: 'oz39mx',\n },\n ],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Bookmark\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTcgM2EyIDIgMCAwIDEgMiAydjE1YTEgMSAwIDAgMS0xLjQ5Ni44NjhsLTQuNTEyLTIuNTc4YTIgMiAwIDAgMC0xLjk4NCAwbC00LjUxMiAyLjU3OEExIDEgMCAwIDEgNSAyMFY1YTIgMiAwIDAgMSAyLTJ6IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/bookmark\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 Bookmark = createLucideIcon(__iconData);\n\nexport default Bookmark;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'rotate-ccw',\n size: 24,\n node: [\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 ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name RotateCcw\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyAxMmE5IDkgMCAxIDAgOS05IDkuNzUgOS43NSAwIDAgMC02Ljc0IDIuNzRMMyA4IiAvPgogIDxwYXRoIGQ9Ik0zIDN2NWg1IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/rotate-ccw\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 RotateCcw = createLucideIcon(__iconData);\n\nexport default RotateCcw;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'play',\n size: 24,\n node: [\n [\n 'path',\n {\n d: 'M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z',\n key: '10ikf1',\n },\n ],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Play\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNSA1YTIgMiAwIDAgMSAzLjAwOC0xLjcyOGwxMS45OTcgNi45OThhMiAyIDAgMCAxIC4wMDMgMy40NThsLTEyIDdBMiAyIDAgMCAxIDUgMTl6IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/play\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 Play = createLucideIcon(__iconData);\n\nexport default Play;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'arrow-up-down',\n size: 24,\n node: [\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};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\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(__iconData);\n\nexport default ArrowUpDown;\n"],"names":["Bookmark"],"mappings":"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A,EAAA,GAAA,EAAC,OAAA,CAAK,aAAW,CAAA,CAAA,EAAC,UAAU,yCAA0C,EAAS,WAAa,6CAIhJ,CAEA,SAAS,GAAQ,GAAE,CAAC,KAAE,CAAG,KAAE,CAAG,CAAkD,EAC9E,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CACC,KAAK,MACL,aAAY,CAAC,IAAI,EAAE,EAAA,CAAK,CACxB,MAAO,CAAC,IAAI,EAAE,EAAA,CAAK,CACnB,UAAU,uEACV,MAAO,CAAE,KAAM,EAAG,IAAK,EAAM,CAAE,GAGrC,cKhYQ,CYAA,ATAA,ACAA,AMAA,ACAA,ANAA,AIAA,ATAA,AOAA,ANAA,AKAA,AJAA,AMAA,CHAA,AEAA,APAA,AWAA,ADAA,ADAA,APAA,AMAA,AFAA,AFAA,ADAA,ASAA,AXAA,CAAA,ACAA,AMAA,ADAA,AHAA,AMAA,APAA,AGAA,AGAA,AEAA,ACAA,APAA,ALAA,CCAA,AUAA,AJAA,AGAA,ANAA,AQAA,ATAA,AGAA,AGAA,ADAA,ARAA,AKAA,AHAA,CCAA,AMAA,ATAA,AEAA,ADAA,AMAA,AKAA,APAA,ADAA,AMAA,AFAA,AGAA,ALAA,CFAA,AEAA,AHAA,AMAA,AFAA,AKAA,AZAA,AEAA,AQAA,ATAA,AUAA,ANAA,AGAA,oBREA,CAAC,CAAC,OAAQ,CAAE,EAAG,gBAAA,CAAA,AAAkB,CAAA,CAAA,CAAA,CAAA,AAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,KAMF,CMJlD,AEAA,AJAA,AFAA,AQAA,ALAA,AJAA,AUAC,AXIiD,AYJlD,AHAC,ANAD,AIAA,GAAA,CPiBL,CUjB6C,APAA,AMAvC,AFAsD,APiB5D,AYjB6C,ARAD,ACAC,AMAvC,AHAuC,ANAA,ADAF,AKAC,GNiBtC,CYhBD,AJAA,ARgBC,AEhBD,AIAA,AHAA,AEAA,AJAA,AGAA,CQAA,ANAA,AJAA,ACAA,AKAA,AHAA,ALgBC,AIhBD,AHAA,CDgBC,AYhBD,ATAA,ACAA,AHAA,AKAA,AEAA,ANAA,AGAA,ALgBC,CGhBD,AEAA,ALgBC,AIhBD,AIAA,ARgBC,AYhBD,AXAA,AKAA,AJAA,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","ignoreList":[11,12,13,14,15,16,17,18,19,20,21,22,23]}
1
+ {"version":3,"sources":["../../../../src/components/board/views/ViewBar.tsx","../../../../src/components/board/views/ViewToolbar.tsx","../../../../src/components/board/TaskCard.tsx","../../../../src/components/board/views/BoardView.tsx","../../../../src/components/board/views/TableView.tsx","../../../../src/components/board/views/EpicView.tsx","../../../../src/components/board/views/TimelineView.tsx","../../../../src/components/board/BulkBar.tsx","../../../../src/components/board/BoardTab.tsx","../../../../src/components/board/NewTaskModal.tsx","../../../../src/app/%28app%29/board/page.tsx","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/chevron-up.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/rotate-ccw.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/sliders-horizontal.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/rows-3.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/square-kanban.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/panel-right-open.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/arrow-up-down.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/table-2.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/corner-down-right.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/play.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/bookmark.ts","../../../../node_modules/.pnpm/lucide-react%401.48.0_react%4019.3.0/node_modules/lucide-react/src/icons/chart-gantt.ts"],"sourcesContent":["\"use client\"\n\nimport { useEffect, useRef, useState } from \"react\"\nimport { Bookmark, ChartGantt, ChevronDown, ListTree, Pencil, Plus, RotateCcw, SquareKanban, Table2, Trash2, type LucideIcon } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport type { SavedView, ViewKind } from \"@/lib/board-views\"\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from \"@/components/ui/dropdown-menu\"\n\nconst KIND_ICON: Record<ViewKind, LucideIcon> = { board: SquareKanban, table: Table2, epic: ListTree, timeline: ChartGantt }\nconst BUILT_IN = [\"board\", \"table\", \"epic\", \"timeline\"]\n\nconst focusRing = \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-accent\"\nconst tabClass = cn(\n \"relative inline-flex h-9 shrink-0 items-center gap-1.5 whitespace-nowrap border-b-2 border-transparent px-0.5 text-[13px] font-medium\",\n \"transition-colors duration-(--duration-fast) ease-out-soft\",\n focusRing,\n)\nconst kbdClass = \"rounded-sm border border-border2 bg-surface2 px-1 py-0.5 font-mono text-[10px] leading-none text-txt\"\n\nexport interface ViewBarProps {\n views: SavedView[]\n activeId: string\n onSelect: (id: string) => void\n onNew: () => void\n onRename: (id: string, name: string) => void\n /** Returns true when the view was deleted (the user may cancel the confirm). */\n onDelete: (id: string) => boolean\n /** Built-ins with a saved copy that differs from the default; they get a \"Restore default\" menu. */\n customizedIds: string[]\n onRestore: (id: string) => void\n}\n\nexport function ViewBar({ views, activeId, onSelect, onNew, onRename, onDelete, customizedIds, onRestore }: ViewBarProps) {\n const ordered = [...views.filter(v => BUILT_IN.includes(v.id)), ...views.filter(v => !BUILT_IN.includes(v.id))]\n const [renaming, setRenaming] = useState<string | null>(null)\n // After rename / delete / restore the focused control unmounts; put focus back on a tab instead of <body>.\n const tabs = useRef(new Map<string, HTMLButtonElement>())\n const pendingFocus = useRef<string | null>(null)\n useEffect(() => {\n const want = pendingFocus.current\n if (!want) return\n const el = tabs.current.get(want)\n if (!el) return\n el.focus()\n pendingFocus.current = null\n })\n\n return (\n <div role=\"group\" aria-label=\"Views\" className=\"flex items-center gap-4 overflow-x-auto border-b border-border [scrollbar-width:none]\">\n {ordered.map(v => {\n const builtIn = BUILT_IN.includes(v.id)\n const Icon = builtIn ? KIND_ICON[v.kind] : Bookmark\n const active = v.id === activeId\n if (renaming === v.id) {\n return (\n <RenameInput\n key={v.id}\n initial={v.name}\n onDone={(name, byKey) => {\n setRenaming(null)\n if (byKey) pendingFocus.current = v.id\n if (name && name !== v.name) onRename(v.id, name)\n }}\n />\n )\n }\n return (\n <span key={v.id} className=\"inline-flex shrink-0 items-center\">\n <button\n ref={el => { if (el) tabs.current.set(v.id, el); else tabs.current.delete(v.id) }}\n type=\"button\"\n aria-pressed={active}\n title={builtIn ? undefined : `Saved view: ${v.name}`}\n onClick={() => onSelect(v.id)}\n className={cn(tabClass, active ? \"text-txt\" : \"text-muted hover:text-txt\")}\n >\n <Icon aria-hidden className={builtIn ? \"size-[15px]\" : \"size-3.5\"} />\n {v.name}\n {/* One named underline: it glides to the new tab when the view changes (a View Transition) */}\n {active && <span aria-hidden className=\"absolute inset-x-0 -bottom-0.5 h-0.5 bg-accent [view-transition-name:board-view-tab]\" />}\n </button>\n {active && (!builtIn || customizedIds.includes(v.id)) && (\n <DropdownMenu>\n <DropdownMenuTrigger\n aria-label={`View options for ${v.name}`}\n className={cn(\"ml-0.5 inline-flex size-6 items-center justify-center rounded-sm text-muted hover:bg-surface2 hover:text-txt\", focusRing)}\n >\n <ChevronDown aria-hidden className=\"size-3.5\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n {builtIn ? (\n <DropdownMenuItem onSelect={() => { pendingFocus.current = v.id; onRestore(v.id) }}>\n <RotateCcw aria-hidden className=\"size-3.5\" />Restore default\n </DropdownMenuItem>\n ) : (\n <>\n <DropdownMenuItem onSelect={() => setRenaming(v.id)}>\n <Pencil aria-hidden className=\"size-3.5\" />Rename\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={() => { if (onDelete(v.id)) pendingFocus.current = v.kind }}\n className=\"text-danger focus:text-danger\"\n >\n <Trash2 aria-hidden className=\"size-3.5\" />Delete view\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </span>\n )\n })}\n <button\n type=\"button\"\n aria-label=\"New view\"\n title=\"New view\"\n onClick={onNew}\n className={cn(tabClass, \"border-transparent text-muted hover:text-txt\")}\n >\n <Plus aria-hidden className=\"size-[15px]\" />\n </button>\n <span className=\"grow\" />\n <span className=\"hidden shrink-0 items-center gap-1.5 pb-1.5 text-[11px] text-muted sm:flex\">\n <kbd className={kbdClass}>v</kbd>next view\n <kbd className={cn(kbdClass, \"ml-1.5\")}>1</kbd>–<kbd className={kbdClass}>4</kbd>\n </span>\n </div>\n )\n}\n\n/** `byKey`: finished with Enter / Esc (focus returns to the tab), not by clicking away. */\nfunction RenameInput({ initial, onDone }: { initial: string; onDone: (name: string, byKey: boolean) => void }) {\n const [name, setName] = useState(initial)\n const ref = useRef<HTMLInputElement>(null)\n const done = useRef(false)\n const finish = (value: string, byKey = false) => {\n if (done.current) return\n done.current = true\n onDone(value.trim(), byKey)\n }\n useEffect(() => {\n // After the dropdown closes (it restores focus to its trigger first).\n const t = setTimeout(() => ref.current?.select(), 0)\n return () => clearTimeout(t)\n }, [])\n return (\n <input\n ref={ref}\n aria-label=\"View name\"\n value={name}\n maxLength={60}\n onChange={e => setName(e.target.value)}\n onBlur={() => finish(name)}\n onKeyDown={e => {\n if (e.key === \"Enter\") finish(name, true)\n if (e.key === \"Escape\") {\n e.stopPropagation()\n finish(initial, true)\n }\n }}\n className=\"my-1 h-7 w-40 shrink-0 rounded-md border border-accent bg-bg px-2 text-[13px] text-txt outline-hidden\"\n />\n )\n}\n","\"use client\"\n\nimport { useEffect, useId, useRef, useState, type ReactNode } from \"react\"\nimport { ArrowDown, ArrowUp, ArrowUpDown, Bookmark, ChevronDown, ListFilter, Plus, Rows3, Search, SlidersHorizontal, X } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport type { FilterProp, FilterRule, GroupBy, PropertyKey, SortProp, SortRule, ViewState } from \"@/lib/board-views\"\nimport { StatusIcon, useStatusLabel } from \"@/components/shared/StatusIcon\"\nimport { useStatusDefs } from \"@/components/shared/status-defs\"\nimport {\n DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuLabel,\n DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\n\n// ── vocabulary ────────────────────────────────────────────────────────────────\n\ntype Op = FilterRule[\"op\"]\n\nconst FILTER_PROPS: { prop: FilterProp; label: string }[] = [\n { prop: \"status\", label: \"Status\" }, { prop: \"epic\", label: \"Epic\" }, { prop: \"size\", label: \"Size\" },\n { prop: \"due\", label: \"Due\" }, { prop: \"deps\", label: \"Depends on\" }, { prop: \"tests\", label: \"Tests\" },\n { prop: \"agent\", label: \"Agent\" }, { prop: \"ready\", label: \"Ready\" }, { prop: \"owner\", label: \"Owner\" },\n]\nconst PROP_LABEL = Object.fromEntries(FILTER_PROPS.map(p => [p.prop, p.label])) as Record<FilterProp, string>\n\n/** Ops offered per prop, with how each reads after the prop name. */\nconst OPS: Record<FilterProp, Partial<Record<Op, string>>> = {\n status: { is: \"is\", \"is-not\": \"is not\" },\n epic: { is: \"is\", \"is-not\": \"is not\" },\n size: { is: \"is\", \"is-not\": \"is not\" },\n due: { before: \"is before\", after: \"is after\", \"is-set\": \"is set\", \"not-set\": \"is not set\" },\n deps: { \"is-set\": \"anything\", \"not-set\": \"nothing\" },\n tests: { \"is-set\": \"reported\", \"not-set\": \"not reported\" },\n agent: { \"is-set\": \"is active\", \"not-set\": \"is not active\" },\n ready: { \"is-set\": \"yes\", \"not-set\": \"no\" },\n owner: { is: \"is\", \"is-not\": \"is not\" },\n}\nconst LIST_PROPS: FilterProp[] = [\"status\", \"epic\", \"size\", \"owner\"]\nconst OWNER_LABEL: Record<string, string> = { human: \"Human\", ai: \"AI agent\", none: \"No owner\" }\nconst SIZES = [\"XS\", \"S\", \"M\", \"L\", \"XL\"]\n\nconst SORT_PROPS: { prop: SortProp; label: string }[] = [\n { prop: \"status\", label: \"Status\" }, { prop: \"id\", label: \"ID\" }, { prop: \"epic\", label: \"Epic\" },\n { prop: \"size\", label: \"Size\" }, { prop: \"due\", label: \"Due\" }, { prop: \"title\", label: \"Title\" },\n]\nconst GROUPS: { value: GroupBy; label: string }[] = [\n { value: \"status\", label: \"Status\" }, { value: \"epic\", label: \"Epic\" }, { value: \"size\", label: \"Size\" }, { value: \"owner\", label: \"Owner\" }, { value: \"none\", label: \"None\" },\n]\nconst LANES: { value: ViewState[\"subGroup\"]; label: string }[] = [\n { value: \"epic\", label: \"Epic\" }, { value: \"size\", label: \"Size\" }, { value: \"none\", label: \"None\" },\n]\nconst PROPERTIES: { key: PropertyKey; label: string }[] = [\n { key: \"status\", label: \"Status\" }, { key: \"epic\", label: \"Epic\" }, { key: \"size\", label: \"Size\" }, { key: \"due\", label: \"Due\" },\n { key: \"deps\", label: \"Depends on\" }, { key: \"tests\", label: \"Tests\" }, { key: \"agent\", label: \"Agent\" }, { key: \"owner\", label: \"Owner\" },\n]\n\nfunction localToday(): string {\n const d = new Date()\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, \"0\")}-${String(d.getDate()).padStart(2, \"0\")}`\n}\n\ntype EpicOption = { id: string; title: string; open?: boolean }\n\nfunction newRule(prop: FilterProp, epics: EpicOption[]): FilterRule {\n switch (prop) {\n case \"status\": return { prop, op: \"is-not\", value: [\"done\"] }\n case \"epic\": return { prop, op: \"is\", value: [(epics.find(e => e.open) ?? epics[0])?.id ?? \"none\"] }\n case \"size\": return { prop, op: \"is\", value: [\"M\"] }\n case \"due\": return { prop, op: \"before\", value: [localToday()] }\n case \"owner\": return { prop, op: \"is\", value: [\"ai\"] }\n default: return { prop, op: \"is-set\", value: [] }\n }\n}\n\n// ── styles ────────────────────────────────────────────────────────────────────\n\nconst focusRing = \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-1 focus-visible:ring-offset-bg\"\nconst btn = cn(\n \"inline-flex h-8 items-center gap-1.5 whitespace-nowrap rounded-md border border-transparent px-2.5 text-xs font-medium text-muted\",\n \"transition-colors duration-(--duration-fast) ease-out-soft hover:bg-surface2 hover:text-txt\",\n focusRing,\n)\nconst btnOn = \"border-border2 bg-surface2 text-txt\"\nconst sel = cn(\"h-7.5 min-w-0 rounded-md border border-border bg-bg px-2 text-[13px] text-txt\", focusRing)\nconst kbdClass = \"rounded-sm border border-border2 bg-surface2 px-1 py-0.5 font-mono text-[10px] leading-none text-txt\"\nconst iconBtn = cn(\"inline-flex size-7 shrink-0 items-center justify-center rounded-md text-muted hover:bg-surface2 hover:text-txt disabled:opacity-40 disabled:hover:bg-transparent\", focusRing)\n\n// ── popover ───────────────────────────────────────────────────────────────────\n\n/**\n * Non-modal popover: trigger button + absolutely positioned panel. Esc closes and returns focus to the trigger,\n * an outside pointer-down closes. The wrapper is only `relative` from sm up; below that the panel anchors to the\n * nearest positioned ancestor (the toolbar's button row) so it can span the screen.\n */\nfunction Popover({\n open, onOpenChange, label, trigger, triggerClassName, panelClassName, anchorClassName, children,\n}: {\n open: boolean\n onOpenChange: (open: boolean) => void\n label: string\n trigger: ReactNode\n triggerClassName?: string\n panelClassName?: string\n anchorClassName?: string\n children: ReactNode\n}) {\n const wrapRef = useRef<HTMLDivElement>(null)\n const triggerRef = useRef<HTMLButtonElement>(null)\n const panelRef = useRef<HTMLDivElement>(null)\n const onOpenChangeRef = useRef(onOpenChange)\n const id = useId()\n\n useEffect(() => {\n onOpenChangeRef.current = onOpenChange\n })\n\n // Deps are [open] only: callers pass inline callbacks, and refocusing on every render would steal focus.\n useEffect(() => {\n if (!open) return\n panelRef.current?.querySelector<HTMLElement>(\"button, input, select\")?.focus()\n const onDown = (e: PointerEvent) => {\n if (!wrapRef.current?.contains(e.target as Node)) onOpenChangeRef.current(false)\n }\n document.addEventListener(\"pointerdown\", onDown)\n return () => document.removeEventListener(\"pointerdown\", onDown)\n }, [open])\n\n return (\n <div ref={wrapRef} className={cn(\"max-sm:flex max-sm:flex-1\", anchorClassName ?? \"sm:relative\")}>\n <button\n ref={triggerRef}\n type=\"button\"\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-controls={open ? id : undefined}\n onClick={() => onOpenChange(!open)}\n className={triggerClassName}\n >\n {trigger}\n </button>\n {open && (\n <div\n ref={panelRef}\n id={id}\n role=\"dialog\"\n aria-label={label}\n onKeyDown={e => {\n if (e.key !== \"Escape\") return\n e.stopPropagation()\n onOpenChange(false)\n triggerRef.current?.focus()\n }}\n className={cn(\n \"absolute top-full z-30 mt-1 rounded-lg border border-border2 bg-surface p-3 text-txt shadow-lg\",\n \"origin-top-right animate-in fade-in-0 zoom-in-[0.98] slide-in-from-top-1 duration-(--duration-fast) ease-out-soft\",\n panelClassName,\n )}\n >\n {children}\n </div>\n )}\n </div>\n )\n}\n\n// ── toolbar ───────────────────────────────────────────────────────────────────\n\nexport interface ViewToolbarProps {\n state: ViewState\n onChange: (next: ViewState) => void\n /** `open`: the epic still has open work (a new Epic rule defaults to the first such). */\n epics: EpicOption[]\n dirty: boolean\n activeIsBuiltIn: boolean\n onSave: () => void\n onSaveAs: (name: string) => void\n onReset: () => void\n /** The integrator focuses #id on \"/\". */\n searchInputId: string\n filterOpen: boolean\n /** \"f\" key opens it. */\n onFilterOpenChange: (open: boolean) => void\n}\n\nexport function ViewToolbar({\n state, onChange, epics, dirty, activeIsBuiltIn, onSave, onSaveAs, onReset, searchInputId, filterOpen, onFilterOpenChange,\n}: ViewToolbarProps) {\n const [sortOpen, setSortOpen] = useState(false)\n const set = (patch: Partial<ViewState>) => onChange({ ...state, ...patch })\n\n // The input owns its value: the URL (state.q) syncs a tick late, which would jump the caret.\n // Adopt state.q only when it changes from outside (Reset, view switch), not while our own writes catch up.\n const [q, setQ] = useState(state.q)\n const [seenQ, setSeenQ] = useState(state.q)\n const [pendingQ, setPendingQ] = useState<string | null>(null)\n if (state.q !== seenQ) {\n setSeenQ(state.q)\n if (state.q === pendingQ) setPendingQ(null)\n else if (pendingQ === null) setQ(state.q)\n }\n const typeQ = (value: string) => {\n setQ(value)\n setPendingQ(value === state.q ? null : value)\n set({ q: value })\n }\n const timeline = state.kind === \"timeline\"\n const board = state.kind === \"board\"\n const groups = timeline ? GROUPS.filter(g => g.value === \"epic\" || g.value === \"none\") : GROUPS\n const groupLabel = GROUPS.find(g => g.value === state.group)?.label ?? \"None\"\n const laneLabel = LANES.find(l => l.value === state.subGroup)?.label ?? \"None\"\n const mobileBtn = \"max-sm:h-9 max-sm:flex-1 max-sm:justify-center max-sm:border-border\"\n\n return (\n <div className=\"flex flex-col gap-2.5\">\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:gap-1\">\n <label className=\"flex h-8 w-full items-center gap-2 rounded-md border border-border bg-bg px-2.5 text-[13px] text-muted focus-within:border-accent sm:w-65 max-sm:h-9\">\n <Search aria-hidden className=\"size-3.5 shrink-0\" />\n <span className=\"sr-only\">Filter by title or ID</span>\n <input\n id={searchInputId}\n type=\"search\"\n value={q}\n placeholder=\"Filter by title or ID…\"\n onChange={e => typeQ(e.target.value)}\n onKeyDown={e => {\n if (e.key !== \"Escape\") return\n if (q) typeQ(\"\")\n else e.currentTarget.blur()\n }}\n className=\"min-w-0 grow bg-transparent text-txt outline-hidden placeholder:text-muted [&::-webkit-search-cancel-button]:hidden\"\n />\n <kbd className={cn(kbdClass, \"max-sm:hidden\")}>/</kbd>\n </label>\n <span className=\"grow max-sm:hidden\" />\n\n <div className=\"relative flex gap-1.5 max-sm:w-full sm:static sm:gap-1\">\n <Popover\n open={filterOpen}\n onOpenChange={onFilterOpenChange}\n label=\"Filter\"\n triggerClassName={cn(btn, mobileBtn, (filterOpen || state.filters.length > 0) && btnOn)}\n panelClassName=\"inset-x-0 sm:left-auto sm:right-0 sm:w-140\"\n trigger={<>\n <ListFilter aria-hidden className=\"size-3.5\" />Filter\n {state.filters.length > 0 && <span className=\"font-mono text-txt\">{state.filters.length}</span>}\n <kbd className={cn(kbdClass, \"ml-0.5 max-sm:hidden\")}>f</kbd>\n </>}\n >\n <FilterBuilder filters={state.filters} epics={epics} onChange={filters => set({ filters })} />\n </Popover>\n\n <Popover\n open={sortOpen}\n onOpenChange={setSortOpen}\n label=\"Sort\"\n triggerClassName={cn(btn, mobileBtn, (sortOpen || state.sorts.length > 0) && btnOn)}\n panelClassName=\"inset-x-0 sm:left-auto sm:right-0 sm:w-95\"\n trigger={<>\n <ArrowUpDown aria-hidden className=\"size-3.5\" />Sort\n {state.sorts.length > 0 && <span className=\"font-mono text-txt\">{state.sorts.length}</span>}\n </>}\n >\n <SortBuilder sorts={state.sorts} onChange={sorts => set({ sorts })} />\n </Popover>\n\n <DropdownMenu>\n {/* The phone board stacks status sections (no swimlanes), so the control would do nothing there. */}\n <DropdownMenuTrigger className={cn(btn, mobileBtn, board && \"max-md:hidden\")}>\n <Rows3 aria-hidden className=\"size-3.5\" />\n <span className=\"max-sm:hidden\">Group</span>\n {board ? (\n <span className=\"text-txt\">Status{state.subGroup !== \"none\" && <><span className=\"px-1 text-muted\">›</span>{laneLabel}</>}</span>\n ) : (\n <span className=\"text-txt\">{groupLabel}</span>\n )}\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {board ? (\n <>\n <DropdownMenuLabel className=\"text-xs text-muted\">Swimlanes</DropdownMenuLabel>\n <DropdownMenuRadioGroup value={state.subGroup} onValueChange={v => set({ subGroup: v as ViewState[\"subGroup\"] })}>\n {LANES.map(l => <DropdownMenuRadioItem key={l.value} value={l.value}>{l.label}</DropdownMenuRadioItem>)}\n </DropdownMenuRadioGroup>\n </>\n ) : (\n <>\n <DropdownMenuLabel className=\"text-xs text-muted\">Group by</DropdownMenuLabel>\n <DropdownMenuRadioGroup value={state.group} onValueChange={v => set({ group: v as GroupBy })}>\n {groups.map(g => <DropdownMenuRadioItem key={g.value} value={g.value}>{g.label}</DropdownMenuRadioItem>)}\n </DropdownMenuRadioGroup>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n\n {!timeline && (\n <DropdownMenu>\n <DropdownMenuTrigger className={cn(btn, \"max-sm:hidden\")}>\n <SlidersHorizontal aria-hidden className=\"size-3.5\" />Properties\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel className=\"text-xs text-muted\">Show</DropdownMenuLabel>\n {PROPERTIES.map(p => (\n <DropdownMenuCheckboxItem\n key={p.key}\n checked={state.properties.includes(p.key)}\n onSelect={e => e.preventDefault()}\n onCheckedChange={on => set({\n properties: PROPERTIES.map(x => x.key).filter(k => (k === p.key ? on === true : state.properties.includes(k))),\n })}\n >\n {p.label}\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n {state.filters.map((rule, i) => (\n <FilterChip key={i} rule={rule} onRemove={() => set({ filters: state.filters.filter((_, j) => j !== i) })} />\n ))}\n <button type=\"button\" onClick={() => onFilterOpenChange(true)} className={cn(btn, \"h-6.5 px-2\")}>\n <Plus aria-hidden className=\"size-3.25\" />Add filter\n </button>\n <span className=\"grow\" />\n {dirty && (\n <SaveArea activeIsBuiltIn={activeIsBuiltIn} onSave={onSave} onSaveAs={onSaveAs} onReset={onReset} />\n )}\n </div>\n </div>\n )\n}\n\n// ── chips ─────────────────────────────────────────────────────────────────────\n\nfunction valueText(rule: FilterRule, label: (key: string) => string): { text: string; mono: boolean } {\n if (rule.prop === \"status\") return { text: rule.value.map(label).join(\", \"), mono: false }\n if (rule.prop === \"epic\") return { text: rule.value.map(v => (v === \"none\" ? \"No epic\" : v)).join(\", \"), mono: !rule.value.includes(\"none\") }\n if (rule.prop === \"owner\") return { text: rule.value.map(v => OWNER_LABEL[v] ?? v).join(\", \"), mono: false }\n return { text: rule.value.join(\", \"), mono: true }\n}\n\nfunction opText(rule: FilterRule): string {\n if (rule.op === \"is\" && rule.value.length > 1) return \"is any of\"\n return OPS[rule.prop][rule.op] ?? rule.op\n}\n\nfunction FilterChip({ rule, onRemove }: { rule: FilterRule; onRemove: () => void }) {\n const hasValue = !(rule.op === \"is-set\" || rule.op === \"not-set\")\n const v = valueText(rule, useStatusLabel())\n const text = `${PROP_LABEL[rule.prop]} ${opText(rule)}${hasValue ? ` ${v.text}` : \"\"}`\n return (\n <span className=\"inline-flex h-6.5 max-w-full items-center gap-1.5 rounded-sm border border-border2 bg-surface pl-2.25 pr-1 text-xs text-txt\">\n <span className=\"truncate\">\n <b className=\"font-medium text-muted\">{PROP_LABEL[rule.prop]}</b> {opText(rule)}\n {hasValue && <> <span className={cn(\"text-txt\", v.mono && \"font-mono text-[11px]\")}>{v.text || \"—\"}</span></>}\n </span>\n <button type=\"button\" aria-label={`Remove filter: ${text}`} onClick={onRemove} className={cn(\"inline-flex rounded-xs p-0.75 text-muted hover:text-txt\", focusRing)}>\n <X aria-hidden className=\"size-3\" />\n </button>\n </span>\n )\n}\n\nfunction SaveArea({ activeIsBuiltIn, onSave, onSaveAs, onReset }: { activeIsBuiltIn: boolean; onSave: () => void; onSaveAs: (name: string) => void; onReset: () => void }) {\n const [naming, setNaming] = useState(false)\n const [name, setName] = useState(\"\")\n const submit = () => {\n const n = name.trim()\n if (!n) return\n onSaveAs(n)\n setNaming(false)\n setName(\"\")\n }\n if (naming) {\n return (\n <form className=\"flex items-center gap-1.5\" onSubmit={e => { e.preventDefault(); submit() }}>\n <input\n autoFocus\n aria-label=\"New view name\"\n placeholder=\"View name\"\n value={name}\n maxLength={60}\n onChange={e => setName(e.target.value)}\n onKeyDown={e => { if (e.key === \"Escape\") { e.stopPropagation(); setNaming(false) } }}\n className=\"h-7 w-44 rounded-md border border-accent bg-bg px-2 text-[13px] text-txt outline-hidden placeholder:text-muted\"\n />\n <button type=\"submit\" disabled={!name.trim()} className={cn(btn, btnOn, \"h-7 disabled:opacity-40\")}>Save</button>\n <button type=\"button\" onClick={() => setNaming(false)} className={cn(btn, \"h-7\")}>Cancel</button>\n </form>\n )\n }\n return (\n <div className=\"flex items-center gap-1\">\n <span className=\"mr-1 text-xs text-muted\">Unsaved changes</span>\n <button type=\"button\" onClick={onReset} className={cn(btn, \"text-txt\")}>Reset</button>\n <button type=\"button\" onClick={() => setNaming(true)} className={cn(btn, \"text-txt\")}>\n {activeIsBuiltIn ? \"Save as new view\" : \"Save as new\"}\n </button>\n <button type=\"button\" onClick={onSave} className={cn(btn, btnOn)}>\n <Bookmark aria-hidden className=\"size-3.25\" />Save view\n </button>\n </div>\n )\n}\n\n// ── filter builder ────────────────────────────────────────────────────────────\n\nfunction FilterBuilder({ filters, epics, onChange }: { filters: FilterRule[]; epics: EpicOption[]; onChange: (f: FilterRule[]) => void }) {\n const update = (i: number, rule: FilterRule) => onChange(filters.map((r, j) => (j === i ? rule : r)))\n const labelId = useId()\n return (\n <div>\n <p id={labelId} className=\"mb-2.5 ml-0.5 text-xs font-semibold\">Show tasks where</p>\n {filters.length === 0 && <p className=\"mb-1 ml-0.5 text-xs text-muted\">No filters yet. Every task shows except cancelled ones.</p>}\n <ul aria-labelledby={labelId} className=\"flex flex-col gap-1.5\">\n {filters.map((rule, i) => {\n const ops = Object.entries(OPS[rule.prop]) as [Op, string][]\n const n = i + 1\n return (\n <li key={i} className=\"flex flex-wrap items-center gap-1.5 text-xs text-muted sm:grid sm:grid-cols-[48px_120px_100px_minmax(0,1fr)_28px]\">\n <span className=\"w-10 pl-1 sm:w-auto\">{i === 0 ? \"Where\" : \"and\"}</span>\n <select\n aria-label={`Rule ${n} property`}\n value={rule.prop}\n onChange={e => update(i, newRule(e.target.value as FilterProp, epics))}\n className={cn(sel, \"w-32.5 sm:w-auto\")}\n >\n {FILTER_PROPS.map(p => <option key={p.prop} value={p.prop}>{p.label}</option>)}\n </select>\n <select\n aria-label={`Rule ${n} condition`}\n value={rule.op}\n onChange={e => {\n const op = e.target.value as Op\n const value = op === \"is-set\" || op === \"not-set\" ? [] : rule.value.length ? rule.value : newRule(rule.prop, epics).value\n update(i, { ...rule, op, value })\n }}\n className={cn(sel, \"w-27.5 sm:w-auto\")}\n >\n {ops.map(([op, label]) => <option key={op} value={op}>{label}</option>)}\n </select>\n <span className=\"min-w-0 grow basis-40 sm:basis-auto\">\n <ValueControl rule={rule} n={n} epics={epics} onChange={value => update(i, { ...rule, value })} />\n </span>\n <button type=\"button\" aria-label={`Remove rule ${n}`} onClick={() => onChange(filters.filter((_, j) => j !== i))} className={iconBtn}>\n <X aria-hidden className=\"size-3.5\" />\n </button>\n </li>\n )\n })}\n </ul>\n <div className=\"mt-2.5 flex flex-wrap items-center gap-1.5 border-t border-border pt-2.5\">\n <button type=\"button\" onClick={() => onChange([...filters, newRule(\"status\", epics)])} className={btn}>\n <Plus aria-hidden className=\"size-3.5\" />Add rule\n </button>\n <span className=\"grow\" />\n <span className=\"text-[11px] text-muted max-sm:hidden\">Rules combine with and</span>\n </div>\n </div>\n )\n}\n\nfunction ValueControl({ rule, n, epics, onChange }: { rule: FilterRule; n: number; epics: EpicOption[]; onChange: (v: string[]) => void }) {\n if (rule.op === \"is-set\" || rule.op === \"not-set\") return null\n if (rule.prop === \"due\") {\n return (\n <input\n type=\"date\"\n aria-label={`Rule ${n} date`}\n value={rule.value[0] ?? \"\"}\n onChange={e => onChange(e.target.value ? [e.target.value] : [])}\n className={cn(sel, \"w-full scheme-dark\")}\n />\n )\n }\n if (!LIST_PROPS.includes(rule.prop)) return null\n return <MultiSelect rule={rule} n={n} epics={epics} onChange={onChange} />\n}\n\nfunction MultiSelect({ rule, n, epics, onChange }: { rule: FilterRule; n: number; epics: EpicOption[]; onChange: (v: string[]) => void }) {\n const [open, setOpen] = useState(false)\n const defs = useStatusDefs()\n const label = useStatusLabel()\n const options: { value: string; node: ReactNode }[] =\n rule.prop === \"status\"\n ? defs.map(d => ({ value: d.id, node: <><StatusIcon status={d.id} />{d.label}</> }))\n : rule.prop === \"epic\"\n ? [\n { value: \"none\", node: <span className=\"text-muted\">No epic</span> },\n ...epics.map(e => ({ value: e.id, node: <><span className=\"font-mono text-[11px] text-muted\">{e.id}</span><span className=\"truncate\">{e.title}</span></> })),\n ]\n : rule.prop === \"owner\"\n ? Object.entries(OWNER_LABEL).map(([value, label]) => ({ value, node: <span>{label}</span> }))\n : SIZES.map(s => ({ value: s, node: <span className=\"font-mono\">{s}</span> }))\n const first = rule.value[0]\n const summary =\n !first ? <span className=\"text-muted\">Choose…</span>\n : rule.prop === \"status\" ? <><StatusIcon status={first} /><span className=\"truncate\">{label(first)}</span></>\n : rule.prop === \"owner\" ? <span className=\"truncate\">{OWNER_LABEL[first] ?? first}</span>\n : rule.prop === \"epic\" && first !== \"none\" ? <><span className=\"font-mono text-[11px] text-muted\">{first}</span><span className=\"truncate\">{epics.find(e => e.id === first)?.title ?? \"\"}</span></>\n : <span className={cn(\"truncate\", rule.prop === \"size\" && \"font-mono\")}>{first === \"none\" ? \"No epic\" : first}</span>\n\n return (\n <Popover\n open={open}\n onOpenChange={setOpen}\n label={`${PROP_LABEL[rule.prop]} values`}\n anchorClassName=\"relative\"\n triggerClassName={cn(sel, \"flex w-full items-center gap-1.5 text-left\")}\n panelClassName=\"left-0 z-40 max-h-64 w-64 overflow-y-auto p-1\"\n trigger={<>\n <span className=\"sr-only\">Rule {n} values: </span>\n {summary}\n {rule.value.length > 1 && <span className=\"font-mono text-[11px] text-muted\">+{rule.value.length - 1}</span>}\n <span className=\"grow\" />\n <ChevronDown aria-hidden className=\"size-3.5 shrink-0 text-muted\" />\n </>}\n >\n <ul className=\"flex flex-col\">\n {options.map(o => (\n <li key={o.value}>\n <label className=\"flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-[13px] text-txt hover:bg-surface2\">\n <input\n type=\"checkbox\"\n checked={rule.value.includes(o.value)}\n onChange={e => onChange(e.target.checked ? [...rule.value, o.value] : rule.value.filter(v => v !== o.value))}\n className=\"size-3.5 accent-accent\"\n />\n <span className=\"flex min-w-0 items-center gap-1.5\">{o.node}</span>\n </label>\n </li>\n ))}\n </ul>\n </Popover>\n )\n}\n\n// ── sort builder ──────────────────────────────────────────────────────────────\n\nfunction SortBuilder({ sorts, onChange }: { sorts: SortRule[]; onChange: (s: SortRule[]) => void }) {\n const update = (i: number, rule: SortRule) => onChange(sorts.map((r, j) => (j === i ? rule : r)))\n const move = (i: number, d: -1 | 1) => {\n const next = [...sorts]\n ;[next[i], next[i + d]] = [next[i + d], next[i]]\n onChange(next)\n }\n const unused = SORT_PROPS.filter(p => !sorts.some(s => s.prop === p.prop))\n return (\n <div>\n <p className=\"mb-2.5 ml-0.5 text-xs font-semibold\">Sort by</p>\n {sorts.length === 0 && <p className=\"mb-1 ml-0.5 text-xs text-muted\">Default order: by ID.</p>}\n <ol className=\"flex flex-col gap-1.5\">\n {sorts.map((rule, i) => {\n const n = i + 1\n const label = SORT_PROPS.find(p => p.prop === rule.prop)?.label ?? rule.prop\n return (\n <li key={rule.prop} className=\"flex items-center gap-1\">\n <button type=\"button\" aria-label={`Move ${label} sort up`} disabled={i === 0} onClick={() => move(i, -1)} className={iconBtn}>\n <ArrowUp aria-hidden className=\"size-3.5\" />\n </button>\n <button type=\"button\" aria-label={`Move ${label} sort down`} disabled={i === sorts.length - 1} onClick={() => move(i, 1)} className={iconBtn}>\n <ArrowDown aria-hidden className=\"size-3.5\" />\n </button>\n <select\n aria-label={`Sort ${n} property`}\n value={rule.prop}\n onChange={e => update(i, { ...rule, prop: e.target.value as SortProp })}\n className={cn(sel, \"ml-0.5 grow\")}\n >\n {SORT_PROPS.filter(p => p.prop === rule.prop || !sorts.some(s => s.prop === p.prop)).map(p => (\n <option key={p.prop} value={p.prop}>{p.label}</option>\n ))}\n </select>\n <select\n aria-label={`Sort ${n} direction`}\n value={rule.dir}\n onChange={e => update(i, { ...rule, dir: e.target.value as SortRule[\"dir\"] })}\n className={cn(sel, \"w-37.5\")}\n >\n <option value=\"asc\">{rule.prop === \"status\" ? \"Workflow order\" : \"Ascending\"}</option>\n <option value=\"desc\">{rule.prop === \"status\" ? \"Reverse workflow\" : \"Descending\"}</option>\n </select>\n <button type=\"button\" aria-label={`Remove ${label} sort`} onClick={() => onChange(sorts.filter((_, j) => j !== i))} className={iconBtn}>\n <X aria-hidden className=\"size-3.5\" />\n </button>\n </li>\n )\n })}\n </ol>\n <div className=\"mt-2.5 border-t border-border pt-2.5\">\n <button type=\"button\" disabled={!unused.length} onClick={() => onChange([...sorts, { prop: unused[0].prop, dir: \"asc\" }])} className={cn(btn, \"disabled:opacity-40\")}>\n <Plus aria-hidden className=\"size-3.5\" />Add sort\n </button>\n </div>\n <p className=\"mx-0.5 mt-2 text-[11px] leading-normal text-muted\">Workflow order: In progress → Review → Todo → Blocked → Done. Ties fall back to ID.</p>\n </div>\n )\n}\n","\"use client\"\n\nimport { useState } from \"react\"\nimport Link from \"next/link\"\nimport { CornerDownRight, CornerUpLeft, FlaskConical, MoreHorizontal, PanelRightOpen, Trash2 } from \"lucide-react\"\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger } from \"@/components/ui/dropdown-menu\"\nimport { useApp } from \"@/context/AppContext\"\nimport { deleteTaskWithUndo } from \"./task-api\"\nimport { OwnerChip } from \"@/components/shared/OwnerChip\"\nimport { TaskDueField, TaskOwnerField, TaskSizeField } from \"./TaskFields\"\nimport { toast } from \"@/components/ui/toast\"\nimport { cn } from \"@/lib/utils\"\nimport type { Task } from \"@/types\"\nimport { AgentDot } from \"@/components/chat/AgentMark\"\nimport { latestReview } from \"@/lib/review\"\nimport { epicOf, sizeOf, type PropertyKey } from \"@/lib/board-views\"\n\nconst ALL_PROPERTIES: PropertyKey[] = [\"status\", \"epic\", \"size\", \"due\", \"deps\", \"tests\", \"agent\", \"owner\"]\n\ninterface TaskCardProps {\n task: Task\n onOpen: () => void\n /** Which lines show; defaults to every property. */\n properties?: PropertyKey[]\n selected?: boolean\n /** Shift / Cmd / Ctrl-click toggles selection instead of opening */\n onSelect?: () => void\n}\n\n/**\n * A task on the board. The column already says the status, so the card doesn't repeat it.\n * Click (or Enter) opens the task panel, where every action lives; drag moves it between columns.\n */\nexport function TaskCard({ task, onOpen, properties = ALL_PROPERTIES, selected = false, onSelect }: TaskCardProps) {\n const [isDragging, setIsDragging] = useState(false)\n const show = (p: PropertyKey) => properties.includes(p)\n const epic = show(\"epic\") && task.phase ? epicOf(task.phase) : null\n const sentBack = task.status === \"todo\" && task.raw ? latestReview(task.raw) : null\n const size = show(\"size\") ? sizeOf(task) : null\n const done = task.status === \"done\" || task.status === \"cancelled\"\n const deps = show(\"deps\") ? task.dependsOn.match(/\\bT\\d+\\b/g) ?? [] : []\n const tests = show(\"tests\") ? task.manualTests : null\n const changesRequested = sentBack?.outcome === \"changes requested\"\n\n return (\n <div\n draggable\n role=\"button\"\n tabIndex={0}\n aria-label={`${task.id} ${task.title}`}\n aria-pressed={onSelect ? selected : undefined}\n onClick={(e) => { if (onSelect && (e.shiftKey || e.metaKey || e.ctrlKey)) onSelect(); else onOpen() }}\n onKeyDown={(e) => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); onOpen() } }}\n onDragStart={(e) => {\n e.dataTransfer.setData(\"taskId\", task.id)\n e.dataTransfer.effectAllowed = \"move\"\n setIsDragging(true)\n }}\n onDragEnd={() => setIsDragging(false)}\n style={{ viewTransitionName: `task-${task.file.replace(/[^a-zA-Z0-9_-]/g, \"_\")}` }}\n className={cn(\n \"group cursor-pointer rounded-lg border border-border bg-surface px-3 py-2.5 text-left outline-hidden\",\n \"transition-[border-color,background-color,opacity,box-shadow] duration-(--duration-fast)\",\n \"hover:border-border2 hover:bg-surface2/50 focus-visible:border-accent/60 focus-visible:shadow-[0_0_0_3px_rgb(var(--rgb-accent)/0.15)]\",\n isDragging && \"cursor-grabbing opacity-50\",\n selected && \"border-accent bg-accent/5 hover:border-accent\",\n )}\n >\n <div className=\"flex items-center gap-1.5 font-mono text-[11px] text-muted\">\n <span>{task.id}</span>\n {show(\"agent\") && <AgentDot attach={{ kind: \"task\", id: task.id }} />}\n {show(\"owner\") && task.owner && (\n <TaskOwnerField task={task}><OwnerChip owner={task.owner} className=\"text-[10px] [&_svg]:size-3\" /></TaskOwnerField>\n )}\n <span className=\"flex-1\" />\n {show(\"due\") && task.due && !done && <TaskDueField task={task}><span title=\"Due\">{task.due.slice(5)}</span></TaskDueField>}\n {size && <TaskSizeField task={task}><span title={task.size} className=\"rounded-sm bg-surface2 px-1 text-[10px]\">{size}</span></TaskSizeField>}\n <CardMenu task={task} onOpen={onOpen} />\n </div>\n\n <p className={cn(\"mt-1 line-clamp-2 text-[13px] font-medium leading-snug\", done ? \"text-muted\" : \"text-txt\")}>{task.title}</p>\n\n {(epic || changesRequested || deps.length > 0 || tests) && (\n <div className=\"mt-2 flex flex-wrap items-center gap-x-2 gap-y-1.5\">\n {epic && (\n <span className=\"inline-flex min-w-0 max-w-full items-center gap-1 text-[11px] text-muted\" title={task.phase}>\n {epic.id && <span className=\"font-mono text-[10px]\">{epic.id}</span>}\n <span className=\"truncate\">{epic.title}</span>\n </span>\n )}\n {changesRequested && (\n <span\n title={sentBack?.note}\n className=\"inline-flex items-center gap-1 rounded-sm border border-amber/40 bg-amber/5 px-1.5 py-0.5 text-[10px] text-amber\"\n >\n <CornerUpLeft className=\"size-3\" aria-hidden /> changes requested\n </span>\n )}\n {deps.length > 0 && (\n <span title={`Depends on ${deps.join(\", \")}`} className=\"inline-flex items-center gap-1 font-mono text-[10px] text-muted\">\n <CornerDownRight className=\"size-3\" aria-label=\"Depends on\" />\n {deps.join(\", \")}\n </span>\n )}\n {tests && (\n <Link\n href={`/manual-tests#${task.id}`}\n draggable={false}\n onClick={(e) => e.stopPropagation()}\n title={`Manual tests: ${tests.done} of ${tests.total} ticked`}\n className={cn(\n \"inline-flex items-center gap-1 rounded-sm border px-1.5 py-0.5 font-mono text-[10px] transition-colors hover:border-accent/50\",\n tests.done === tests.total ? \"border-teal/30 bg-teal/5 text-teal\" : \"border-border text-muted\",\n )}\n >\n <FlaskConical className=\"size-3\" aria-hidden />\n {tests.done}/{tests.total}\n </Link>\n )}\n </div>\n )}\n </div>\n )\n}\n\n/** ⋯ on the card (on hover / focus). Events are stopped so the card doesn't open or drag underneath. */\nfunction CardMenu({ task, onOpen }: { task: Task; onOpen: () => void }) {\n const { rootParam } = useApp()\n const stop = (e: React.SyntheticEvent) => e.stopPropagation()\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n draggable={false}\n aria-label={`Actions for ${task.id}`}\n onClick={stop}\n onKeyDown={stop}\n className=\"-my-1 -mr-1 grid size-5 place-items-center rounded-sm text-muted opacity-0 transition-opacity hover:bg-surface2 hover:text-txt focus-visible:opacity-100 group-hover:opacity-100 data-[state=open]:opacity-100\"\n >\n <MoreHorizontal className=\"size-3.5\" />\n </button>\n </DropdownMenuTrigger>\n {/* React events bubble through the portal to the card: stop them here */}\n <DropdownMenuContent align=\"end\" className=\"w-40\" onClick={stop} onKeyDown={stop}>\n <DropdownMenuItem onSelect={onOpen}><PanelRightOpen /> Open</DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onSelect={() => { deleteTaskWithUndo(task, rootParam).catch((e: Error) => toast(e.message)) }}\n className=\"text-danger focus:text-danger\"\n >\n <Trash2 /> Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","\"use client\"\n\nimport { useState, type ReactNode } from \"react\"\nimport { ChevronDown, ChevronRight } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport type { Task, TaskStatus } from \"@/types\"\nimport { groupTasks, type PropertyKey, type TaskGroup, type ViewState } from \"@/lib/board-views\"\nimport { StatusIcon, useStatusLabel } from \"@/components/shared/StatusIcon\"\nimport { useStatusDefs } from \"@/components/shared/status-defs\"\nimport { displayStatus } from \"@/lib/statuses\"\nimport { TaskCard } from \"../TaskCard\"\n\nexport interface ViewProps {\n tasks: Task[]\n allTasks: Task[]\n state: ViewState\n agentTasks: Set<string>\n onOpenTask: (task: Task) => void\n selected?: Set<string>\n /** Toggle (or with `on`, set) selection for these ids */\n onToggleSelect?: (ids: string[], on?: boolean) => void\n}\n\n/** A column is a status key: built-in or one of the project's own (R055). */\ntype Column = string\n/** Review is optional: a task can wait there for a human, but nothing has to pass through it. */\n/** Mobile stacks sections by urgency: by category in this order, then the project's order within one. */\nconst URGENCY: TaskStatus[] = [\"in-progress\", \"review\", \"todo\", \"blocked\", \"paused\", \"done\"]\n/** Newest done IDs shown in the collapsed Done column. */\nconst DONE_IDS = 5\n/** Fully done lanes shown before \"+ N more … all done\". */\nconst DONE_LANES = 4\n\n/** One 4px mark per task, in its status hue (same as the Manual tests / Activity marks). */\nconst MARK: Record<TaskStatus, string> = {\n todo: \"bg-border2\",\n \"in-progress\": \"bg-amber\",\n review: \"bg-accent\",\n blocked: \"bg-danger\",\n paused: \"bg-muted/60\",\n done: \"bg-teal\",\n cancelled: \"bg-border\",\n}\n\nconst isDone = (t: Task) => t.status === \"done\" || t.status === \"cancelled\"\nconst newestFirst = (a: Task, b: Task) => b.id.localeCompare(a.id, undefined, { numeric: true })\n/** Cancelled tasks (shown only when a status filter names them) sit in Done, matching the lane tallies. */\nconst inColumn = (tasks: Task[], col: Column) => tasks.filter((t) => displayStatus(t) === col || (col === \"done\" && t.status === \"cancelled\"))\n\nexport function BoardView({ tasks, state, onOpenTask, onMoveTask, selected, onToggleSelect }: ViewProps & { onMoveTask: (id: string, status: string) => void }) {\n const [doneOpen, setDoneOpen] = useState(false)\n const defs = useStatusDefs()\n const label = useStatusLabel()\n // The project's statuses in its order; cancelled shows inside Done. Paused and Done sit collapsed until opened.\n const COLUMNS: Column[] = defs.filter((d) => d.id !== \"cancelled\").map((d) => d.id)\n const MOBILE_ORDER: Column[] = [...defs.filter((d) => d.id !== \"cancelled\")]\n .sort((a, b) => URGENCY.indexOf(a.category) - URGENCY.indexOf(b.category)).map((d) => d.id)\n const [pausedOpen, setPausedOpen] = useState(false)\n const [laneOpen, setLaneOpen] = useState<Record<string, boolean>>({})\n const [showAllDoneLanes, setShowAllDoneLanes] = useState(false)\n // Empty lane cells are drop targets; they only draw a box while a card is being dragged\n const [dragging, setDragging] = useState(false)\n\n if (tasks.length === 0) {\n return (\n <div className=\"grid place-items-center rounded-lg border border-dashed border-border px-4 py-12 text-center\">\n <p className=\"text-sm font-medium text-txt\">No tasks match these filters.</p>\n <p className=\"mt-1 text-xs text-muted\">Remove a filter or clear the search to see more.</p>\n </div>\n )\n }\n\n const lanes: TaskGroup[] | null = state.subGroup === \"none\" ? null : groupTasks(tasks, state.subGroup)\n // A card inside an epic lane doesn't repeat the epic\n const properties: PropertyKey[] = state.subGroup === \"epic\" ? state.properties.filter((p) => p !== \"epic\") : state.properties\n const card = (t: Task) => (\n <TaskCard\n key={t.id}\n task={t}\n properties={properties}\n onOpen={() => onOpenTask(t)}\n selected={selected?.has(t.id)}\n onSelect={onToggleSelect && (() => onToggleSelect([t.id]))}\n />\n )\n // Lanes with open work first, then fully done ones (collapsed, capped)\n const openLanes = lanes?.filter((l) => !l.tasks.every(isDone)) ?? []\n const doneLanes = lanes?.filter((l) => l.tasks.every(isDone)) ?? []\n const hiddenDoneLanes = showAllDoneLanes ? 0 : Math.max(0, doneLanes.length - DONE_LANES)\n const shownLanes = [...openLanes, ...doneLanes.slice(0, doneLanes.length - hiddenDoneLanes)]\n const laneNoun = state.subGroup === \"epic\" ? \"epics\" : \"sizes\"\n // Done cards always sit in the Done column: it widens when opened, or when you open a finished lane to see its cards\n const doneWide = doneOpen || doneLanes.some((l) => laneOpen[l.key])\n const toggleDone = () => {\n if (doneWide) { setDoneOpen(false); setLaneOpen((m) => Object.fromEntries(Object.entries(m).filter(([k]) => !doneLanes.some((l) => l.key === k)))) }\n else setDoneOpen(true)\n }\n const width = (col: Column) => ((col === \"done\" && !doneWide) || (col === \"paused\" && !pausedOpen) ? \"140px\" : \"minmax(0,1fr)\")\n const grid = { gridTemplateColumns: COLUMNS.map(width).join(\" \") }\n\n const cells = (list: Task[], compact: boolean) =>\n COLUMNS.map((col) => {\n const colTasks = inColumn(list, col)\n return (\n <DropCell key={col} status={col} onMoveTask={onMoveTask}>\n {(col === \"done\" && !doneWide) || (col === \"paused\" && !pausedOpen) ? (\n <ColumnSummary tasks={colTasks} noun={col === \"done\" ? \"done\" : \"paused\"} compact={compact} dragging={dragging} onOpenTask={onOpenTask} />\n ) : colTasks.length ? (\n (col === \"done\" ? [...colTasks].sort(newestFirst) : colTasks).map(card)\n ) : compact && !dragging ? null : (\n <div className=\"grid h-11 place-items-center rounded-lg border border-dashed border-border text-[11px] text-muted/70\">\n {compact ? \"\" : \"Drop a task here\"}\n </div>\n )}\n </DropCell>\n )\n })\n\n return (\n <>\n {/* Desktop: status columns, optionally split into swimlanes */}\n <div className=\"hidden md:block\" onDragStartCapture={() => setDragging(true)} onDragEndCapture={() => setDragging(false)}>\n <div className={cn(\"grid gap-3 border-b border-border\", lanes && \"pl-7.5\")} style={grid}>\n {COLUMNS.map((col) => (\n // The header is a drop target too, so a card can always reach every status (even when all lanes are done)\n <DropCell key={col} status={col} onMoveTask={onMoveTask} header>\n <div className=\"flex min-w-0 items-center gap-1.5 px-0.5 pb-2 text-xs font-semibold text-txt\">\n <StatusIcon status={col} />\n <h2 className=\"truncate\">{label(col)}</h2>\n <span className=\"font-mono font-normal text-muted tabular-nums\">{inColumn(tasks, col).length}</span>\n {(col === \"done\" || col === \"paused\") && (() => {\n const wide = col === \"done\" ? doneWide : pausedOpen\n return (\n <>\n <span className=\"flex-1\" />\n <button\n type=\"button\"\n onClick={col === \"done\" ? toggleDone : () => setPausedOpen((v) => !v)}\n aria-expanded={wide}\n aria-label={`${wide ? \"Collapse\" : \"Expand\"} ${label(col)}`}\n className=\"-my-1 grid size-6 place-items-center rounded-md text-muted outline-hidden transition-colors duration-(--duration-fast) hover:bg-surface2 hover:text-txt focus-visible:ring-2 focus-visible:ring-accent/60\"\n >\n <ChevronRight className={cn(\"size-3.5 transition-transform duration-(--duration-base) ease-out-soft\", wide && \"rotate-180\")} aria-hidden />\n </button>\n </>\n )\n })()}\n </div>\n </DropCell>\n ))}\n </div>\n\n {!lanes ? (\n <div className=\"grid gap-3 pt-3\" style={grid}>{cells(tasks, false)}</div>\n ) : (\n <>\n {shownLanes.map((lane) => {\n const allDone = lane.tasks.every(isDone)\n const open = laneOpen[lane.key] ?? !allDone\n const doneCount = lane.tasks.filter(isDone).length\n return (\n <section key={lane.key} aria-label={lane.epicId ? `${lane.epicId} ${lane.label}` : lane.label}>\n <button\n type=\"button\"\n onClick={() => setLaneOpen((m) => ({ ...m, [lane.key]: !open }))}\n aria-expanded={open}\n className=\"mt-1.5 flex h-8.5 w-full items-center gap-2.5 rounded-md px-1.5 text-left outline-hidden transition-colors duration-(--duration-fast) hover:bg-surface2 focus-visible:ring-2 focus-visible:ring-accent/60\"\n >\n {open ? <ChevronDown className=\"size-3.5 shrink-0 text-muted\" aria-hidden /> : <ChevronRight className=\"size-3.5 shrink-0 text-muted\" aria-hidden />}\n {lane.epicId && <span className=\"font-mono text-[11px] text-muted\">{lane.epicId}</span>}\n <span className=\"min-w-0 truncate text-[13px] font-semibold text-txt\">{lane.label}</span>\n <span className=\"flex w-30 shrink-0 gap-0.5\" aria-hidden>\n {lane.tasks.map((t) => <span key={t.id} className={cn(\"h-1 flex-1 rounded-full\", MARK[t.status])} />)}\n </span>\n <span className=\"font-mono text-[11px] text-muted tabular-nums\" aria-label={`${doneCount} of ${lane.tasks.length} done`}>\n <span className=\"text-txt\">{doneCount}</span>/{lane.tasks.length}\n </span>\n {allDone && <span className=\"text-xs text-muted\">all done</span>}\n </button>\n <div className={cn(\"grid transition-[grid-template-rows,opacity] duration-(--duration-base) ease-out-soft\", open ? \"grid-rows-[1fr] opacity-100\" : \"grid-rows-[0fr] opacity-0\")}>\n <div className=\"min-h-0 overflow-hidden\" inert={!open}>\n <div className=\"grid gap-3 pt-2 pb-1 pl-7.5\" style={grid}>{cells(lane.tasks, true)}</div>\n </div>\n </div>\n </section>\n )\n })}\n {hiddenDoneLanes > 0 && (\n <p className=\"mt-2 ml-9 text-xs text-muted\">\n + <span className=\"font-mono\">{hiddenDoneLanes}</span> more {laneNoun}, all done ·{\" \"}\n <button\n type=\"button\"\n onClick={() => setShowAllDoneLanes(true)}\n className=\"rounded-sm text-txt underline decoration-accent underline-offset-2 outline-hidden hover:decoration-txt focus-visible:ring-2 focus-visible:ring-accent/60\"\n >\n Show\n </button>\n </p>\n )}\n </>\n )}\n </div>\n\n {/* Mobile: stacked status sections, no columns */}\n <div className=\"md:hidden\">\n {tasks.every(isDone) && <p className=\"mt-3.5 text-sm text-muted\">Nothing open. Every task here is done.</p>}\n {MOBILE_ORDER.map((col) => {\n const colTasks = inColumn(tasks, col)\n if (!colTasks.length) return null\n const collapsed = (col === \"done\" && !doneOpen) || (col === \"paused\" && !pausedOpen)\n return (\n <section key={col} aria-label={label(col)}>\n <h2 className=\"mt-3.5 mb-2 flex items-center gap-1.5 text-xs font-semibold text-txt\">\n <StatusIcon status={col} />\n {label(col)}\n <span className=\"font-mono font-normal text-muted tabular-nums\">{colTasks.length}</span>\n <span className=\"h-px flex-1 bg-border\" />\n {(col === \"done\" || col === \"paused\") && (\n <button\n type=\"button\"\n onClick={() => (col === \"done\" ? setDoneOpen : setPausedOpen)((v) => !v)}\n aria-expanded={!collapsed}\n className=\"min-h-11 rounded-md px-2 text-xs font-normal text-muted outline-hidden hover:text-txt focus-visible:ring-2 focus-visible:ring-accent/60\"\n >\n {collapsed ? \"Show\" : \"Hide\"}\n </button>\n )}\n </h2>\n {!collapsed && <div className=\"flex flex-col gap-2\">{(col === \"done\" ? [...colTasks].sort(newestFirst) : colTasks).map(card)}</div>}\n </section>\n )\n })}\n </div>\n </>\n )\n}\n\n/** A drop target for one status (a whole column, or one lane's slice of it). Dropping only changes status. */\nfunction DropCell({ status, onMoveTask, header = false, children }: { status: Column; onMoveTask: (id: string, status: string) => void; header?: boolean; children: ReactNode }) {\n const [over, setOver] = useState(false)\n return (\n <div\n data-column={header ? undefined : status}\n data-column-header={header ? status : undefined}\n className={cn(\n \"flex min-w-0 flex-col gap-2 rounded-lg\",\n !header && \"min-h-11\",\n \"transition-[background-color,box-shadow] duration-(--duration-fast)\",\n over && \"bg-accent/5 shadow-[0_0_0_1px_rgb(var(--rgb-accent)/0.5)]\",\n )}\n onDragOver={(e) => { e.preventDefault(); setOver(true) }}\n onDragLeave={(e) => { if (!e.currentTarget.contains(e.relatedTarget as Node)) setOver(false) }}\n onDrop={(e) => {\n e.preventDefault()\n setOver(false)\n const taskId = e.dataTransfer.getData(\"taskId\")\n if (taskId) onMoveTask(taskId, status)\n }}\n >\n {children}\n </div>\n )\n}\n\n/** Collapsed Done / Paused: the count and the newest few IDs (each opens its task). */\nfunction ColumnSummary({ tasks, noun, compact, dragging, onOpenTask }: { tasks: Task[]; noun: string; compact: boolean; dragging: boolean; onOpenTask: (task: Task) => void }) {\n if (!tasks.length) {\n if (compact && !dragging) return null\n return <div className=\"grid h-11 place-items-center rounded-lg border border-dashed border-border text-[11px] text-muted/70\">{compact ? \"\" : \"Drop here\"}</div>\n }\n const newest = [...tasks].sort(newestFirst).slice(0, DONE_IDS)\n return (\n <div className=\"flex flex-col gap-1 rounded-lg border border-dashed border-border2 px-2 py-1.5 text-[11px] text-muted\">\n <span className=\"flex flex-wrap gap-x-1.5 font-mono\">\n {newest.map((t) => (\n <button\n key={t.id}\n type=\"button\"\n onClick={() => onOpenTask(t)}\n title={t.title}\n className=\"rounded-sm text-txt outline-hidden hover:text-accent focus-visible:ring-2 focus-visible:ring-accent/60\"\n >\n {t.id}\n </button>\n ))}\n </span>\n <span><span className=\"font-mono\">{tasks.length}</span> {noun}</span>\n </div>\n )\n}\n","\"use client\"\n\nimport { useState, type MouseEvent } from \"react\"\nimport { ArrowDown, ArrowUp, Bot, Check, ChevronRight, FlaskConical, Minus } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport { useStatusDefs } from \"@/components/shared/status-defs\"\nimport { localToday } from \"@/lib/roadmap-health\"\nimport { TaskDueField, TaskOwnerField, TaskSizeField, TaskStatusField } from \"../TaskFields\"\nimport { epicOf, groupTasks, type PropertyKey, type SortProp, type SortRule, type TaskGroup, type ViewState } from \"@/lib/board-views\"\nimport type { Task, TaskStatus } from \"@/types\"\n\ninterface ViewProps {\n tasks: Task[]\n allTasks: Task[]\n state: ViewState\n agentTasks: Set<string>\n onOpenTask: (task: Task) => void\n selected?: Set<string>\n onToggleSelect?: (ids: string[], on?: boolean) => void\n}\n\ntype TableViewProps = ViewProps & { onSort: (sorts: SortRule[]) => void }\n\nconst ORDER: PropertyKey[] = [\"status\", \"epic\", \"owner\", \"size\", \"due\", \"deps\", \"tests\", \"agent\"]\nconst LABEL: Record<PropertyKey, string> = {\n status: \"Status\", epic: \"Epic\", size: \"Size\", due: \"Due\", deps: \"Depends on\", tests: \"Tests\", agent: \"Agent\", owner: \"Owner\",\n}\nconst WIDTH: Record<PropertyKey, string> = {\n status: \"w-[120px]\", epic: \"w-[170px]\", size: \"w-[56px]\", due: \"w-[92px]\", deps: \"w-[140px]\", tests: \"w-[72px]\", agent: \"w-[88px]\", owner: \"w-[104px]\",\n}\n/** Hidden below md: the phone table keeps ID · Title · Status · Due · Agent. */\nconst WIDE_ONLY = new Set<PropertyKey>([\"epic\", \"size\", \"deps\", \"tests\", \"owner\"])\nconst SORTABLE = new Set<string>([\"id\", \"title\", \"status\", \"epic\", \"size\", \"due\"])\nconst MARK_BG: Record<TaskStatus, string> = {\n todo: \"bg-border2\", \"in-progress\": \"bg-amber\", review: \"bg-accent\", blocked: \"bg-danger\", paused: \"bg-muted/60\", done: \"bg-teal\", cancelled: \"bg-border\",\n}\n\nconst cellMono = \"font-mono text-[11px] text-muted\"\nconst ring = \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent\"\n\n/** Click = the only sort (asc, then desc); shift-click = add / flip a secondary sort. */\nexport function nextSorts(sorts: SortRule[], prop: SortProp, additive: boolean): SortRule[] {\n const i = sorts.findIndex((s) => s.prop === prop)\n const flip = (s: SortRule): SortRule => ({ prop: s.prop, dir: s.dir === \"asc\" ? \"desc\" : \"asc\" })\n if (additive) {\n return i < 0 ? [...sorts, { prop, dir: \"asc\" }] : sorts.map((s, j) => (j === i ? flip(s) : s))\n }\n return sorts.length === 1 && i === 0 ? [flip(sorts[0])] : [{ prop, dir: \"asc\" }]\n}\n\nexport function TableView({ tasks, state, agentTasks, onOpenTask, onSort, selected = new Set(), onToggleSelect }: TableViewProps) {\n const defs = useStatusDefs()\n const props = ORDER.filter((p) => state.properties.includes(p))\n const groups: TaskGroup[] =\n state.group === \"none\" ? [{ key: \"all\", label: \"All tasks\", epicId: null, tasks }] : groupTasks(tasks, state.group, defs)\n // Groups whose tasks are all done start collapsed; the user's toggles override.\n const [toggled, setToggled] = useState<Record<string, boolean>>({})\n const today = localToday()\n\n if (tasks.length === 0) {\n return (\n <div className=\"rounded-lg border border-border px-4 py-12 text-center\">\n <p className=\"text-sm text-txt\">No tasks match these filters.</p>\n <p className=\"mt-1 text-xs text-muted\">Remove a filter or clear the search to see more.</p>\n </div>\n )\n }\n\n const colCount = 3 + props.length\n const allPicked = tasks.every((t) => selected.has(t.id))\n const somePicked = !allPicked && tasks.some((t) => selected.has(t.id))\n const hideSm = (p: PropertyKey) => (WIDE_ONLY.has(p) ? \"hidden md:table-cell\" : \"\")\n\n const header = (key: string, label: string, extra = \"\") => {\n const idx = state.sorts.findIndex((s) => s.prop === key)\n const rule = idx >= 0 ? state.sorts[idx] : null\n if (!SORTABLE.has(key)) {\n return <th key={key} scope=\"col\" className={cn(\"px-2.5 text-left font-medium\", extra)}>{label}</th>\n }\n const Arrow = rule?.dir === \"desc\" ? ArrowDown : ArrowUp\n return (\n <th\n key={key}\n scope=\"col\"\n aria-sort={idx === 0 ? (rule?.dir === \"desc\" ? \"descending\" : \"ascending\") : \"none\"}\n className={cn(\"px-1 text-left font-medium\", extra)}\n >\n <button\n type=\"button\"\n title=\"Click to sort · Shift-click to add a sort\"\n onClick={(e) => onSort(nextSorts(state.sorts, key as SortProp, e.shiftKey))}\n className={cn(\n \"inline-flex h-7 items-center gap-1 rounded-sm px-1.5 transition-colors duration-(--duration-fast) ease-out-soft hover:bg-surface2 hover:text-txt\",\n rule && \"text-txt\",\n ring,\n )}\n >\n {label}\n {rule && (\n <>\n <Arrow className=\"size-3\" aria-hidden />\n <span className=\"font-mono text-[10px] text-muted\">{idx + 1}</span>\n </>\n )}\n </button>\n </th>\n )\n }\n\n const cell = (task: Task, p: PropertyKey) => {\n const cls = cn(\"px-2.5\", hideSm(p))\n switch (p) {\n case \"status\": {\n return (\n <td key={p} className={cls}>\n <TaskStatusField task={task} />\n </td>\n )\n }\n case \"epic\": {\n const epic = epicOf(task.phase)\n return (\n <td key={p} className={cls}>\n {epic.id || epic.title ? (\n <span className=\"flex min-w-0 items-center gap-1.5 text-xs\">\n {epic.id && <span className={cellMono}>{epic.id}</span>}\n <span className=\"truncate text-muted\">{epic.title}</span>\n </span>\n ) : <span className={cellMono}>—</span>}\n </td>\n )\n }\n case \"size\":\n return <td key={p} className={cn(cls, cellMono)}><TaskSizeField task={task} /></td>\n case \"owner\":\n return <td key={p} className={cls}><TaskOwnerField task={task} /></td>\n case \"due\": {\n const overdue = !!task.due && task.status !== \"done\" && task.status !== \"cancelled\" && task.due < today\n return (\n <td key={p} className={cn(cls, cellMono)}>\n <TaskDueField task={task}><span className={cn(\"font-mono text-[11px]\", overdue ? \"text-amber\" : task.due ? \"text-muted\" : \"text-muted/70\")}>{task.due ?? \"—\"}</span></TaskDueField>\n </td>\n )\n }\n case \"deps\": {\n const ids = task.dependsOn.match(/T\\d+/g)\n return <td key={p} className={cn(cls, cellMono, \"truncate\")}>{ids ? ids.join(\", \") : \"—\"}</td>\n }\n case \"tests\":\n return (\n <td key={p} className={cn(cls, cellMono)}>\n {task.manualTests ? (\n <span className=\"inline-flex items-center gap-1\">\n <FlaskConical className=\"size-3\" aria-hidden />\n {task.manualTests.done}/{task.manualTests.total}\n </span>\n ) : \"—\"}\n </td>\n )\n case \"agent\":\n return (\n <td key={p} className={cls}>\n {agentTasks.has(task.id) ? (\n <span className=\"inline-flex items-center gap-1 text-[11px] text-txt\">\n <Bot className=\"size-3.5 text-accent\" aria-hidden />working\n </span>\n ) : <span className={cellMono}>—</span>}\n </td>\n )\n }\n }\n\n const row = (task: Task) => {\n const done = task.status === \"done\" || task.status === \"cancelled\"\n return (\n <tr\n key={task.id}\n onClick={(e: MouseEvent) => {\n // The title button handles its own click (and Enter); this covers the rest of the row.\n if ((e.target as HTMLElement).closest(\"button\")) return\n onOpenTask(task)\n }}\n className={cn(\n \"h-9 cursor-pointer border-b border-border text-[13px] transition-colors duration-(--duration-fast) ease-out-soft last:border-b-0 hover:bg-surface2\",\n selected.has(task.id) && \"bg-accent/5\",\n )}\n >\n <td className=\"pl-3\" onClick={(e) => e.stopPropagation()}>\n <SelectBox label={`Select ${task.id}`} checked={selected.has(task.id)} onChange={() => onToggleSelect?.([task.id])} />\n </td>\n <td className={cn(\"px-2.5\", cellMono)}>{task.id}</td>\n <td className=\"min-w-0 px-1\">\n <button\n type=\"button\"\n onClick={() => onOpenTask(task)}\n title={task.title}\n className={cn(\"block w-full truncate rounded-sm px-1.5 py-1 text-left font-medium\", done ? \"text-muted\" : \"text-txt\", ring)}\n >\n {task.title}\n </button>\n </td>\n {props.map((p) => cell(task, p))}\n </tr>\n )\n }\n\n return (\n <div className=\"overflow-x-auto rounded-lg border border-border\">\n <table className=\"w-full min-w-[580px] table-fixed border-collapse md:min-w-[760px]\">\n <colgroup>\n <col className=\"w-[34px]\" />\n <col className=\"w-[72px]\" />\n <col className=\"w-[200px] md:w-auto\" />\n {props.map((p) => <col key={p} className={cn(WIDTH[p], WIDE_ONLY.has(p) && \"hidden md:table-column\")} />)}\n </colgroup>\n <thead>\n <tr className=\"h-[34px] border-b border-border2 bg-bg text-[11px] text-muted\">\n <th scope=\"col\" className=\"pl-3 text-left\">\n <SelectBox\n label=\"Select all shown tasks\"\n checked={allPicked}\n mixed={somePicked}\n onChange={() => onToggleSelect?.(tasks.map((t) => t.id), !allPicked)}\n />\n </th>\n {header(\"id\", \"ID\")}\n {header(\"title\", \"Title\")}\n {props.map((p) => header(p, LABEL[p], hideSm(p)))}\n </tr>\n </thead>\n {groups.map((g) => {\n const doneCount = g.tasks.filter((t) => t.status === \"done\").length\n const allDone = g.tasks.length > 0 && g.tasks.every((t) => t.status === \"done\" || t.status === \"cancelled\")\n const open = state.group === \"none\" || (toggled[g.key] ?? !allDone)\n return (\n <tbody key={g.key}>\n {state.group !== \"none\" && (\n <tr className=\"h-[38px] border-b border-border bg-surface\">\n <th scope=\"rowgroup\" colSpan={colCount} className=\"p-0 text-left font-normal\">\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setToggled((s) => ({ ...s, [g.key]: !open }))}\n className={cn(\"flex h-[38px] w-full items-center gap-2.5 px-2 text-left transition-colors duration-(--duration-fast) ease-out-soft hover:bg-surface2\", ring)}\n >\n <ChevronRight\n className={cn(\"size-3.5 shrink-0 text-muted transition-transform duration-(--duration-fast) ease-out-soft\", open && \"rotate-90\")}\n aria-hidden\n />\n {g.epicId && <span className={cellMono}>{g.epicId}</span>}\n <span className=\"min-w-0 truncate text-[13px] font-semibold text-txt\">{g.label}</span>\n <span className=\"flex w-[110px] shrink-0 gap-0.5\" aria-hidden>\n {g.tasks.map((t) => <span key={t.id} className={cn(\"h-1 flex-1 rounded-full\", MARK_BG[t.status])} />)}\n </span>\n <span className={cellMono}>\n <span className=\"text-txt\">{doneCount}</span>/{g.tasks.length}\n </span>\n </button>\n </th>\n </tr>\n )}\n {open && g.tasks.map(row)}\n </tbody>\n )\n })}\n </table>\n </div>\n )\n}\n\n/** Selection checkbox drawn like the Manual tests boxes, in the accent (selected, not done). */\nfunction SelectBox({ label, checked, mixed = false, onChange }: { label: string; checked: boolean; mixed?: boolean; onChange: () => void }) {\n return (\n <span className=\"relative inline-flex size-4 align-middle\">\n <input\n type=\"checkbox\"\n aria-label={label}\n checked={checked}\n ref={(el) => { if (el) el.indeterminate = mixed }}\n onChange={onChange}\n className={cn(\n \"peer size-4 cursor-pointer appearance-none rounded-sm border border-muted bg-bg transition-colors duration-(--duration-fast)\",\n \"checked:border-accent checked:bg-accent hover:border-txt focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent\",\n mixed && \"border-accent\",\n )}\n />\n {mixed\n ? <Minus strokeWidth={3} className=\"pointer-events-none absolute inset-0.5 size-3 text-accent\" aria-hidden />\n : <Check strokeWidth={3} className=\"pointer-events-none absolute inset-0.5 size-3 text-accent-fg opacity-0 peer-checked:opacity-100\" aria-hidden />}\n </span>\n )\n}\n","\"use client\"\n\nimport { useMemo, useState } from \"react\"\nimport { Bot, ChevronRight, Play } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\nimport type { Task, TaskStatus } from \"@/types\"\nimport { depOutline, groupTasks, isReady, sizeOf, type TaskGroup, type ViewState } from \"@/lib/board-views\"\nimport { STATUS_META, StatusIcon } from \"@/components/shared/StatusIcon\"\n\ninterface ViewProps {\n tasks: Task[]\n allTasks: Task[]\n state: ViewState\n agentTasks: Set<string>\n onOpenTask: (task: Task) => void\n}\n\nconst RING = \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n/** Collapsed all-done epics shown before \"+ N more\". */\nconst DONE_SHOWN = 3\nconst UP_NEXT_MAX = 5\n\nconst MARK_BG: Record<TaskStatus, string> = {\n todo: \"bg-border2\",\n \"in-progress\": \"bg-amber\",\n review: \"bg-accent\",\n blocked: \"bg-danger\",\n paused: \"bg-muted/60\",\n done: \"bg-teal\",\n cancelled: \"bg-border2\",\n}\n\nconst idNum = (id: string) => parseInt(id.replace(/\\D/g, \"\"), 10) || 0\nconst byId = (a: Task, b: Task) => idNum(a.id) - idNum(b.id)\nconst depIds = (t: Task) => t.dependsOn.match(/T\\d+/g) ?? []\n\nfunction epicStatus(tasks: Task[]): TaskStatus {\n if (tasks.some(t => t.status === \"in-progress\" || t.status === \"review\")) return \"in-progress\"\n const open = tasks.filter(t => t.status !== \"done\" && t.status !== \"cancelled\")\n if (open.length > 0 && open.every(t => t.status === \"blocked\")) return \"blocked\"\n if (tasks.length > 0 && tasks.every(t => t.status === \"done\")) return \"done\"\n return \"todo\"\n}\n\nexport function EpicView({ tasks, allTasks, agentTasks, onOpenTask }: ViewProps) {\n const [expanded, setExpanded] = useState<Set<string>>(new Set())\n const [showAllDone, setShowAllDone] = useState(false)\n\n const taskMap = useMemo(() => new Map(allTasks.map(t => [t.id, t])), [allTasks])\n const groups = useMemo(() => groupTasks(tasks, \"epic\"), [tasks])\n\n // vibedoc_next_task order: epic order, then ID.\n const { firstReady, upNext } = useMemo(() => {\n const firstReady = new Set<string>()\n const ready: Task[] = []\n const waiting: { task: Task; on: string }[] = []\n for (const g of groups) {\n const sorted = [...g.tasks].sort(byId)\n const r = sorted.filter(t => isReady(t, taskMap))\n if (r[0]) firstReady.add(r[0].id)\n ready.push(...r)\n for (const t of sorted) {\n if (t.status !== \"todo\" && t.status !== \"blocked\") continue\n const open = depIds(t).filter(id => taskMap.get(id)?.status !== \"done\")\n if (open.length === 1) waiting.push({ task: t, on: open[0] })\n }\n }\n const upNext = [\n ...ready.map(task => ({ task, on: null as string | null })),\n ...waiting,\n ].slice(0, UP_NEXT_MAX)\n return { firstReady, upNext }\n }, [groups, taskMap])\n\n if (tasks.length === 0) {\n return (\n <div className=\"px-8 py-16 text-center\">\n <p className=\"text-sm font-medium text-txt\">No tasks match these filters.</p>\n <p className=\"mt-1 text-xs text-muted\">Clear a filter or the search to see more epics.</p>\n </div>\n )\n }\n\n const toggle = (key: string) =>\n setExpanded(prev => {\n const next = new Set(prev)\n if (next.has(key)) next.delete(key)\n else next.add(key)\n return next\n })\n\n let doneSeen = 0\n const hidden: TaskGroup[] = []\n const sections = groups.map(g => {\n const status = epicStatus(g.tasks)\n if (status === \"done\" && !expanded.has(g.key)) {\n doneSeen++\n if (doneSeen > DONE_SHOWN && !showAllDone) {\n hidden.push(g)\n return null\n }\n return <DoneLine key={g.key} group={g} onExpand={() => toggle(g.key)} />\n }\n return (\n <EpicSection\n key={g.key}\n group={g}\n status={status}\n collapsible={status === \"done\"}\n onCollapse={() => toggle(g.key)}\n firstReady={firstReady}\n agentTasks={agentTasks}\n onOpenTask={onOpenTask}\n />\n )\n })\n\n return (\n <div className=\"grid gap-6 px-4 pt-[18px] pb-8 sm:px-8 lg:grid-cols-[minmax(0,1fr)_280px]\">\n <div className=\"flex min-w-0 flex-col gap-3.5\">\n {sections}\n {hidden.length > 0 && (\n <p className=\"mx-0.5 text-xs text-muted\">\n + <span className=\"font-mono\">{hidden.slice(0, 3).map(g => g.epicId ?? g.label).join(\", \")}</span>\n {hidden.length > 3 && <> and <span className=\"font-mono\">{hidden.length - 3}</span> more</>}, all done ·{\" \"}\n <button type=\"button\" onClick={() => setShowAllDone(true)} className={cn(\"rounded-sm text-txt underline decoration-accent underline-offset-2 hover:decoration-txt\", RING)}>\n Show\n </button>\n </p>\n )}\n </div>\n\n <aside aria-label=\"Up next\" className=\"flex flex-col gap-2.5 lg:pt-1\">\n <p className=\"text-xs font-semibold text-txt\">Up next</p>\n {upNext.length === 0 && <p className=\"text-xs text-muted\">Nothing is ready right now.</p>}\n {upNext.map(({ task, on }) => (\n <button\n key={task.id}\n type=\"button\"\n onClick={() => onOpenTask(task)}\n className={cn(\n \"flex flex-col gap-1.5 rounded-lg border border-border bg-surface px-[11px] py-[9px] text-left transition-colors duration-(--duration-fast) ease-out-soft hover:border-border2\",\n on && \"opacity-90\",\n RING,\n )}\n >\n <span className={cn(\"flex items-center gap-1.5 text-xs\", on ? \"text-muted\" : \"text-txt\")}>\n <StatusIcon status={task.status} />\n <span className=\"font-mono text-[11px] text-muted\">{task.id}</span>\n {on ? <>Waiting on <span className=\"font-mono\">{on}</span></> : \"Ready\"}\n </span>\n <span className=\"text-[13px] font-medium text-txt\">{task.title}</span>\n </button>\n ))}\n <p className=\"mt-1.5 text-[11px] leading-normal text-muted\">\n Same order as <span className=\"font-mono\">vibedoc_next_task</span>: a task is ready when everything it depends on is done.\n </p>\n </aside>\n </div>\n )\n}\n\nfunction Progress({ tasks }: { tasks: Task[] }) {\n const done = tasks.filter(t => t.status === \"done\").length\n return (\n <span className=\"shrink-0 font-mono text-[11px] text-muted\">\n <span className=\"text-txt\">{done}</span>/{tasks.length}\n </span>\n )\n}\n\nfunction DoneLine({ group, onExpand }: { group: TaskGroup; onExpand: () => void }) {\n return (\n <button\n type=\"button\"\n aria-expanded={false}\n onClick={onExpand}\n className={cn(\n \"flex h-10 items-center gap-3 rounded-lg border border-border bg-surface px-4 text-left transition-colors duration-(--duration-fast) ease-out-soft hover:bg-surface2\",\n RING,\n )}\n >\n <ChevronRight className=\"size-3.5 shrink-0 text-muted\" aria-hidden />\n {group.epicId && <span className=\"font-mono text-[11px] text-muted\">{group.epicId}</span>}\n <span className=\"min-w-0 truncate text-sm font-medium text-muted\">{group.label}</span>\n <span className=\"flex-1\" />\n <StatusIcon status=\"done\" />\n <Progress tasks={group.tasks} />\n </button>\n )\n}\n\nfunction EpicSection({\n group, status, collapsible, onCollapse, firstReady, agentTasks, onOpenTask,\n}: {\n group: TaskGroup\n status: TaskStatus\n collapsible: boolean\n onCollapse: () => void\n firstReady: Set<string>\n agentTasks: Set<string>\n onOpenTask: (task: Task) => void\n}) {\n const outline = useMemo(() => depOutline(group.tasks), [group.tasks])\n const meta = STATUS_META[status]\n const marks = [...group.tasks].sort(byId)\n\n return (\n <section className=\"flex flex-col gap-2.5 rounded-lg border border-border bg-surface px-3.5 pt-3.5 pb-2.5\">\n <div className=\"flex flex-wrap items-baseline gap-x-3 gap-y-1 px-0.5\">\n {group.epicId && <span className=\"font-mono text-[11px] text-muted\">{group.epicId}</span>}\n <h2 className=\"m-0 min-w-0 text-[1.1rem] font-semibold text-txt\">{group.label}</h2>\n <span className={cn(\"inline-flex items-center gap-1.5 self-center text-xs\", meta.text)}>\n <StatusIcon status={status} />\n {meta.label}\n </span>\n <span className=\"flex-1\" />\n <Progress tasks={group.tasks} />\n {collapsible && (\n <button\n type=\"button\"\n aria-expanded\n onClick={onCollapse}\n className={cn(\"self-center rounded-sm text-xs text-muted hover:text-txt\", RING)}\n >\n Collapse\n </button>\n )}\n </div>\n\n <div className=\"flex gap-[3px] px-0.5\" aria-hidden>\n {marks.map(t => (\n <span key={t.id} className={cn(\"h-[5px] flex-1 rounded-full\", MARK_BG[t.status])} />\n ))}\n </div>\n\n <ul className=\"flex flex-col\">\n {outline.map(({ task, depth, alsoAfter }) => {\n const done = task.status === \"done\"\n const size = sizeOf(task)\n return (\n <li key={task.id}>\n <button\n type=\"button\"\n onClick={() => onOpenTask(task)}\n style={{ paddingLeft: 16 + depth * 26 }}\n className={cn(\n \"relative flex h-[38px] w-full items-center gap-2.5 rounded-md pr-3 text-left transition-colors duration-(--duration-fast) ease-out-soft hover:bg-surface2\",\n RING,\n )}\n >\n {depth > 0 && (\n <span\n aria-hidden\n style={{ left: 2 + depth * 26 }}\n className=\"absolute top-0 bottom-1/2 w-2.5 rounded-bl-md border-b border-l border-border2\"\n />\n )}\n <StatusIcon status={task.status} />\n <span className=\"font-mono text-[11px] text-muted\">{task.id}</span>\n <span className={cn(\"min-w-0 truncate text-[13.5px] font-medium\", done ? \"text-muted\" : \"text-txt\")}>\n {task.title}\n </span>\n {alsoAfter.length > 0 && (\n <span className=\"hidden shrink-0 font-mono text-[10px] text-muted sm:inline\">\n also after {alsoAfter.join(\", \")}\n </span>\n )}\n {firstReady.has(task.id) && (\n <span className=\"inline-flex h-5 shrink-0 items-center gap-1 rounded-sm border border-accent px-[7px] text-[11px] text-txt\">\n <Play className=\"size-2.5 text-accent\" aria-hidden />\n Ready · next for the agent\n </span>\n )}\n {agentTasks.has(task.id) && (\n <span className=\"inline-flex shrink-0 items-center gap-1 text-[11px] text-txt\">\n <Bot className=\"size-3 text-accent\" aria-hidden />\n working\n </span>\n )}\n <span className=\"flex-1\" />\n {size && <span className=\"font-mono text-[10px] text-muted\">{size}</span>}\n </button>\n </li>\n )\n })}\n </ul>\n </section>\n )\n}\n","\"use client\"\n\nimport { useEffect, useMemo, useRef, useState } from \"react\"\nimport { cn } from \"@/lib/utils\"\nimport { STATUS_META } from \"@/components/shared/StatusIcon\"\nimport type { ActivityEvent, Task } from \"@/types\"\nimport {\n depOutline, foldAxis, groupTasks, timelineBars,\n type AxisSegment, type TimelineBar, type TimelineScale, type ViewState,\n} from \"@/lib/board-views\"\n\ninterface ViewProps {\n tasks: Task[]\n allTasks: Task[]\n state: ViewState\n agentTasks: Set<string>\n onOpenTask: (task: Task) => void\n}\n\nexport interface TimelineViewProps extends ViewProps {\n events: ActivityEvent[]\n loading: boolean\n onScale: (s: TimelineScale) => void\n}\n\nconst MIN = 60_000\nconst HOUR = 60 * MIN\nconst DAY = 24 * HOUR\nconst FOLD_GAP = 30 * MIN\nconst FOLD_W = 56\nconst SEG_MIN_W = 170\nconst ACTIVE_PX_PER_MIN = 2.2\n/** Sticky lane-label gutter: --gw is 110px on phones, 220px from sm up. */\nconst GUTTER = \"[--gw:110px] sm:[--gw:220px]\"\nconst ROW_H = 20\nconst LANE_PAD = 10\nconst HEAD_H = 28\nconst TRAIL_W = 200\n\nconst SCALES: { value: TimelineScale; label: string }[] = [\n { value: \"active\", label: \"Active time\" },\n { value: \"day\", label: \"Day\" },\n { value: \"week\", label: \"Week\" },\n]\n\n/** A laid-out axis stretch: [startMs, endMs] drawn at x … x + width. */\ninterface Seg extends AxisSegment { x: number; width: number }\n\nconst hm = (ms: number) => new Date(ms).toLocaleTimeString(\"en-GB\", { hour: \"2-digit\", minute: \"2-digit\", hour12: false })\nconst md = (ms: number) => new Date(ms).toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" })\nconst startOfDay = (ms: number) => { const d = new Date(ms); d.setHours(0, 0, 0, 0); return d.getTime() }\n\nfunction gapLabel(ms: number) {\n const m = Math.round(ms / MIN)\n if (m < 60) return `${m}m`\n const h = Math.floor(m / 60)\n if (h >= 24) return `${Math.round(m / 60)}h`\n return m % 60 ? `${h}h ${m % 60}m` : `${h}h`\n}\n\nfunction segLabel(s: AxisSegment) {\n return md(s.startMs) === md(s.endMs)\n ? `${md(s.startMs)} · ${hm(s.startMs)}–${hm(s.endMs)}`\n : `${md(s.startMs)} ${hm(s.startMs)} – ${md(s.endMs)} ${hm(s.endMs)}`\n}\n\n/** `**Due:** YYYY-MM-DD` is a local calendar date: build it from parts, never `new Date(\"YYYY-MM-DD\")`. */\nfunction dueMs(due: string | null) {\n const m = due?.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/)\n return m ? new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3])).getTime() : null\n}\n\nfunction layoutAxis(bars: TimelineBar[], scale: TimelineScale, now: number): Seg[] {\n if (!bars.length) return []\n if (scale === \"active\") {\n let x = 0\n return foldAxis(bars, FOLD_GAP).map((s, i) => {\n if (i > 0) x += FOLD_W\n const width = Math.max(SEG_MIN_W, ((s.endMs - s.startMs) / MIN) * ACTIVE_PX_PER_MIN)\n const seg = { ...s, x, width }\n x += width\n return seg\n })\n }\n const lo = Math.min(...bars.map((b) => b.startMs))\n const hi = Math.max(...bars.map((b) => b.endMs), bars.some((b) => b.open) ? now : 0)\n const startMs = startOfDay(lo)\n const endMs = startOfDay(hi) + DAY\n const pxPerMs = scale === \"day\" ? 40 / HOUR : 120 / DAY\n return [{ startMs, endMs, x: 0, width: (endMs - startMs) * pxPerMs }]\n}\n\n/** Pixel x for a moment, or null when it falls outside the axis (e.g. inside a folded gap). */\nfunction xAt(segs: Seg[], ms: number): number | null {\n for (const s of segs) {\n if (ms >= s.startMs && ms <= s.endMs) {\n const span = s.endMs - s.startMs || 1\n return s.x + ((ms - s.startMs) / span) * s.width\n }\n }\n return null\n}\n\nfunction ticks(segs: Seg[], scale: TimelineScale): { x: number; label: string | null }[] {\n const out: { x: number; label: string | null }[] = []\n for (const s of segs) {\n const dur = s.endMs - s.startMs\n const step = scale === \"week\" ? DAY : scale === \"day\" ? 6 * HOUR : dur <= 3 * HOUR ? 30 * MIN : dur <= 8 * HOUR ? HOUR : 3 * HOUR\n // Day/week ticks start at local midnight; active ticks at the first round step inside the segment.\n const first = scale === \"active\" ? Math.ceil(s.startMs / step) * step : s.startMs\n for (let t = first; t <= s.endMs; t += step) {\n const x = xAt([s], t)\n if (x == null) continue\n out.push({ x, label: scale === \"week\" ? md(t) : scale === \"day\" ? (hm(t) === \"00:00\" ? md(t) : hm(t)) : null })\n }\n }\n return out\n}\n\nfunction useNow(intervalMs = 30_000) {\n const [now, setNow] = useState(() => Date.now())\n useEffect(() => {\n const id = setInterval(() => setNow(Date.now()), intervalMs)\n return () => clearInterval(id)\n }, [intervalMs])\n return now\n}\n\nexport default function TimelineView({ tasks, state, agentTasks, onOpenTask, events, loading, onScale }: TimelineViewProps) {\n const now = useNow()\n const scale = state.scale\n\n const bars = useMemo(() => timelineBars(tasks, events, now), [tasks, events, now])\n const segs = useMemo(() => layoutAxis(bars, scale, now), [bars, scale, now])\n const tickList = useMemo(() => ticks(segs, scale), [segs, scale])\n const lanes = useMemo(() => {\n const barBy = new Map(bars.map((b) => [b.taskId, b]))\n return groupTasks(tasks, state.group).map((g) => {\n const worked = g.tasks.filter((t) => barBy.has(t.id))\n .map((t) => ({ task: t, bar: barBy.get(t.id) as TimelineBar }))\n .sort((a, b) => a.bar.startMs - b.bar.startMs)\n const openTasks = g.tasks.filter((t) => !barBy.has(t.id) && t.status !== \"done\" && t.status !== \"cancelled\")\n const planned = depOutline(openTasks).map((o) => o.task)\n // A finished epic's bars share one compact row (no labels; the bar titles carry them).\n const compact = !planned.length && g.tasks.every((t) => t.status === \"done\" || t.status === \"cancelled\")\n return { group: g, worked, planned, compact }\n }).filter((l) => l.worked.length || l.planned.length)\n }, [tasks, bars, state.group])\n\n const axisW = segs.length ? segs[segs.length - 1].x + segs[segs.length - 1].width : 0\n const canvasW = axisW + TRAIL_W\n const nowX = xAt(segs, now)\n const lastSegX = segs.length ? segs[segs.length - 1].x : null\n\n // Once per scale, bring the now line into view, or the latest work when now is past the axis.\n const scrollRef = useRef<HTMLDivElement>(null)\n const scrolledFor = useRef<TimelineScale | null>(null)\n useEffect(() => {\n const el = scrollRef.current\n if (!el || lastSegX == null || scrolledFor.current === scale) return\n scrolledFor.current = scale\n const gutter = el.querySelector<HTMLElement>(\"[data-gutter]\")?.offsetWidth ?? 0\n // No now line: show the latest segment from its start (on a phone it is wider than the view)\n el.scrollLeft = nowX != null ? nowX - (el.clientWidth - gutter) / 2 : Math.min(el.scrollWidth - el.clientWidth, lastSegX - 16)\n }, [nowX, scale, lastSegX])\n\n const scaleControl = (\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-xs text-muted max-sm:hidden\">Scale</span>\n <div role=\"group\" aria-label=\"Timeline scale\" className=\"flex rounded-md border border-border p-0.5\">\n {SCALES.map((s) => (\n <button\n key={s.value}\n type=\"button\"\n aria-pressed={scale === s.value}\n onClick={() => onScale(s.value)}\n className={cn(\n \"h-6 rounded-[5px] border border-transparent px-2.5 text-xs font-medium text-muted outline-none transition-colors duration-(--duration-fast) ease-out-soft\",\n \"hover:bg-surface2 hover:text-txt focus-visible:ring-2 focus-visible:ring-accent\",\n scale === s.value && \"border-border2 bg-surface2 text-txt\",\n )}\n >\n {s.label}\n </button>\n ))}\n </div>\n {scale === \"active\" && <span className=\"ml-2 text-xs text-muted max-sm:hidden\">Idle gaps folded</span>}\n </div>\n )\n\n if (!tasks.length) {\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex justify-end\">{scaleControl}</div>\n <div className=\"rounded-lg border border-dashed border-border px-6 py-10 text-center\">\n <p className=\"text-sm text-txt\">No tasks match these filters.</p>\n <p className=\"mt-1 text-xs text-muted\">Clear a filter or the search to see more of the timeline.</p>\n </div>\n </div>\n )\n }\n\n if (loading && !events.length) {\n return (\n <div className=\"flex flex-col gap-4\" aria-busy=\"true\" aria-label=\"Loading timeline\">\n <div className=\"flex justify-end\">{scaleControl}</div>\n {[0, 1, 2].map((i) => (\n <div key={i} className=\"flex gap-4 border-b border-border pb-4\">\n <div className=\"h-9 w-[200px] animate-pulse rounded bg-surface2\" />\n <div className=\"flex flex-1 flex-col gap-1.5 pt-1\">\n <div className=\"h-3.5 w-1/3 animate-pulse rounded-sm bg-surface2\" style={{ marginLeft: `${10 + i * 15}%` }} />\n <div className=\"h-3.5 w-1/5 animate-pulse rounded-sm bg-surface2\" style={{ marginLeft: `${30 + i * 10}%` }} />\n </div>\n </div>\n ))}\n </div>\n )\n }\n\n const hasDue = tasks.some((t) => t.due)\n\n return (\n <div className=\"flex min-w-0 flex-col gap-3\">\n <div className=\"flex justify-end\">{scaleControl}</div>\n\n {!bars.length && (\n <p className=\"text-sm text-muted\">\n No task moves in the activity log yet — bars appear once tasks move to In progress.\n </p>\n )}\n\n <div ref={scrollRef} className=\"min-w-0 overflow-x-auto overscroll-x-contain\">\n <div className={cn(\"relative\", GUTTER)} style={{ width: `calc(var(--gw) + ${canvasW}px)` }}>\n {/* Axis header */}\n <div className=\"flex\" style={{ height: HEAD_H + 8 }}>\n <div data-gutter className=\"sticky left-0 z-20 w-(--gw) shrink-0 bg-bg\" />\n <div className=\"relative\" style={{ width: canvasW }}>\n {segs.map((s, i) => (\n <div key={s.startMs}>\n {scale === \"active\" && (\n <div\n className=\"absolute bottom-0 truncate border-b border-border2 font-mono text-[11px] text-txt\"\n style={{ left: s.x, width: s.width, height: HEAD_H }}\n >\n {segLabel(s)}\n </div>\n )}\n {scale === \"active\" && i > 0 && (\n <span\n className=\"absolute bottom-0 flex justify-center font-mono text-[10px] whitespace-nowrap text-muted\"\n style={{ left: s.x - FOLD_W, width: FOLD_W, height: HEAD_H }}\n title={`Idle gap of ${gapLabel(s.startMs - segs[i - 1].endMs)} folded`}\n >\n {gapLabel(s.startMs - segs[i - 1].endMs)}\n </span>\n )}\n </div>\n ))}\n {scale !== \"active\" && segs.length > 0 && (\n <div className=\"absolute bottom-0 border-b border-border2\" style={{ left: 0, width: axisW, height: HEAD_H }}>\n {tickList.map((t) => t.label && (\n <span key={t.x} className=\"absolute top-0 pl-1 font-mono text-[11px] whitespace-nowrap text-txt\" style={{ left: t.x }}>\n {t.label}\n </span>\n ))}\n </div>\n )}\n {nowX != null && (\n <span\n className=\"absolute top-0 z-10 -translate-x-1/2 rounded bg-accent px-1.5 py-0.5 font-mono text-[10px] text-accent-fg\"\n style={{ left: nowX }}\n >\n {hm(now)}\n </span>\n )}\n </div>\n </div>\n\n {/* Lanes */}\n {lanes.map(({ group, worked, planned, compact }, laneIndex) => {\n const rows = compact ? 1 : worked.length + planned.length\n const height = Math.max(52, rows * ROW_H + LANE_PAD * 2)\n const lastEnd = worked.reduce<number | null>((max, w) => {\n const x = xAt(segs, w.bar.endMs)\n return x == null ? max : Math.max(max ?? 0, x)\n }, null)\n const plannedX = (lastEnd ?? nowX ?? 0) + 8\n return (\n <section key={group.key} className=\"flex border-b border-border\" aria-label={group.epicId ? `${group.epicId} ${group.label}` : group.label}>\n <div className=\"sticky left-0 z-20 flex w-(--gw) shrink-0 flex-col gap-0.5 bg-bg py-2.5 pr-2 sm:pr-4\">\n {group.epicId && <span className=\"font-mono text-[11px] text-muted\">{group.epicId}</span>}\n <span className=\"line-clamp-2 text-[13px] leading-tight font-semibold text-txt sm:line-clamp-none\" title={group.label}>{group.label}</span>\n </div>\n <div className=\"relative\" style={{ width: canvasW, height }}>\n {tickList.map((t) => (\n <span key={t.x} aria-hidden className=\"absolute inset-y-0 w-px bg-border opacity-60\" style={{ left: t.x }} />\n ))}\n {scale === \"active\" && segs.slice(1).map((s) => (\n <span key={s.startMs} aria-hidden className=\"absolute inset-y-0 border-l border-dashed border-border2\" style={{ left: s.x - FOLD_W / 2 }} />\n ))}\n {nowX != null && <span aria-hidden className=\"absolute inset-y-0 z-10 w-px bg-accent\" style={{ left: nowX }} />}\n\n {worked.map(({ task, bar }, i) => {\n const x0 = xAt(segs, bar.startMs) ?? 0\n const x1 = xAt(segs, bar.endMs) ?? x0\n const w = Math.max(4, x1 - x0)\n const top = LANE_PAD + (compact ? 0 : i) * ROW_H\n const agent = agentTasks.has(task.id)\n const live = bar.open && bar.status === \"in-progress\"\n const label = live\n ? `${task.id} · in progress since ${hm(bar.startMs)}`\n : bar.open\n ? `${task.id} · ${STATUS_META[bar.status].label.toLowerCase()}, first moved ${md(bar.startMs)} ${hm(bar.startMs)}`\n : `${task.id} · worked ${md(bar.startMs)} ${hm(bar.startMs)}–${hm(bar.endMs)}`\n const due = dueMs(task.due)\n const dueX = due == null ? null : xAt(segs, due)\n return (\n <div key={task.id}>\n <button\n type=\"button\"\n title={`${label} — ${task.title}`}\n aria-label={`${label} — ${task.title}`}\n onClick={() => onOpenTask(task)}\n className={cn(\n \"absolute h-3.5 origin-left animate-grow-x rounded-[3px] outline-none transition-opacity duration-(--duration-fast) ease-out-soft hover:opacity-80\",\n \"focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-1 focus-visible:ring-offset-bg\",\n live ? \"bg-amber\" : bar.status === \"done\" ? \"bg-teal\" : \"bg-border2\",\n )}\n // Worked time draws in from its start, one lane after another (capped at 240ms)\n style={{ left: x0, width: w, top: top + 3, animationDelay: `${Math.min(laneIndex * 40, 240)}ms` }}\n />\n {!compact && (\n <span\n className={cn(\"pointer-events-none absolute font-mono text-[10px] leading-[14px] whitespace-nowrap\", live ? \"text-txt\" : \"text-muted\")}\n style={{ left: x0 + w + 6, top: top + 3 }}\n >\n {task.id}{live && (agent ? \" · agent working\" : \" · in progress\")}\n </span>\n )}\n {dueX != null && <DueMark x={dueX} top={top + 3} due={task.due} />}\n </div>\n )\n })}\n\n {planned.map((task, i) => {\n const top = LANE_PAD + (worked.length + i) * ROW_H\n return (\n <button\n key={task.id}\n type=\"button\"\n onClick={() => onOpenTask(task)}\n title={`${task.id} · planned — ${task.title}`}\n aria-label={`${task.id} · planned — ${task.title}`}\n className=\"group absolute flex items-center gap-1.5 rounded-sm outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n style={{ left: plannedX, top: top + 3 }}\n >\n <span aria-hidden className=\"h-3.5 w-6 rounded-[3px] border border-dashed border-muted transition-colors duration-(--duration-fast) group-hover:border-txt\" />\n <span className=\"font-mono text-[10px] leading-[14px] whitespace-nowrap text-txt\">{task.id} · planned</span>\n </button>\n )\n })}\n </div>\n </section>\n )\n })}\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-2 text-[11px] text-muted\">\n <span className=\"flex items-center gap-1.5\"><span aria-hidden className=\"h-2 w-[18px] rounded-sm bg-teal\" />Worked: first move to In progress → Done (activity log)</span>\n <span className=\"flex items-center gap-1.5\"><span aria-hidden className=\"h-2 w-[18px] rounded-sm bg-amber\" />In progress now</span>\n <span className=\"flex items-center gap-1.5\"><span aria-hidden className=\"h-2 w-[18px] rounded-sm border border-dashed border-muted\" />Planned: queued in dependency order</span>\n <span className=\"flex items-center gap-1.5\"><span aria-hidden className=\"size-2.5 rotate-45 border border-txt\" />{hasDue ? \"Due date\" : \"Due date (none set in these tasks)\"}</span>\n </div>\n </div>\n )\n}\n\nfunction DueMark({ x, top, due }: { x: number; top: number; due: string | null }) {\n return (\n <span\n role=\"img\"\n aria-label={`Due ${due}`}\n title={`Due ${due}`}\n className=\"absolute size-2.5 -translate-x-1/2 rotate-45 border border-txt bg-bg\"\n style={{ left: x, top: top + 2 }}\n />\n )\n}\n","\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport { ChevronUp, FolderInput, Trash2, X } from \"lucide-react\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { StatusIcon } from \"@/components/shared/StatusIcon\"\nimport { useStatusDefs } from \"@/components/shared/status-defs\"\nimport { toast, undoToast } from \"@/components/ui/toast\"\nimport { useApp } from \"@/context/AppContext\"\nimport type { RoadmapItem, Task } from \"@/types\"\nimport { useItemCommands } from \"@/components/shared/item-commands\"\n\n\nasync function post<T>(url: string, body: unknown): Promise<T> {\n const res = await fetch(url, { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify(body) })\n const json = await res.json().catch(() => null)\n if (!res.ok) throw new Error(json?.error ?? `Request failed (${res.status})`)\n return json as T\n}\n\nconst pill = \"inline-flex h-8 items-center gap-1.5 rounded-md px-2.5 text-xs text-txt hover:bg-surface transition-colors\"\n\n/** Floating bar for the selected tasks: status, epic, delete (one request, one refresh). */\nexport function BulkBar({ ids, onClear }: { ids: string[]; onClear: () => void }) {\n const { rootParam } = useApp()\n const [epics, setEpics] = useState<RoadmapItem[]>([])\n const [busy, setBusy] = useState(false)\n const [statusOpen, setStatusOpen] = useState(false)\n const defs = useStatusDefs()\n\n useEffect(() => {\n fetch(`/api/roadmap${rootParam}`)\n .then((r) => (r.ok ? r.json() : null))\n .then((d: { items?: RoadmapItem[] } | null) => setEpics((d?.items ?? []).filter((i) => i.parent !== null && i.status !== \"done\")))\n .catch(() => setEpics([]))\n }, [rootParam])\n\n async function run(action: unknown, after?: (r: { deleted: { task: Task; links: unknown[] }[] }) => void) {\n setBusy(true)\n try {\n const r = await post<{ deleted: { task: Task; links: unknown[] }[] }>(`/api/tasks/bulk${rootParam}`, { ids, action })\n onClear()\n after?.(r)\n } catch (e) {\n toast((e as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n const remove = () => run({ delete: true }, ({ deleted }) => {\n undoToast(`Deleted ${deleted.length} task${deleted.length === 1 ? \"\" : \"s\"}`, async () => {\n // Reverse order: each delete recorded its index after the earlier ones were already gone\n for (const { task, links } of [...deleted].reverse()) {\n await post(`/api/tasks/restore${rootParam}`, { file: task.file, raw: task.raw, links })\n }\n })\n })\n\n useItemCommands(`${ids.length} selected task${ids.length === 1 ? \"\" : \"s\"}`, [\n { action: \"status\", label: \"Change status…\", run: () => setStatusOpen(true) },\n { action: \"remove\", label: `Delete ${ids.length} task${ids.length === 1 ? \"\" : \"s\"}`, run: remove },\n ])\n\n return (\n <div\n role=\"toolbar\"\n aria-label=\"Bulk actions\"\n className=\"fixed bottom-6 left-1/2 z-50 flex -translate-x-1/2 animate-slide-in items-center gap-1 rounded-lg border border-border bg-surface2 p-1 pl-3 shadow-xl\"\n >\n <span className=\"mr-1 font-mono text-xs tabular-nums text-txt\">{ids.length} selected</span>\n <DropdownMenu open={statusOpen} onOpenChange={setStatusOpen}>\n <DropdownMenuTrigger asChild>\n <button type=\"button\" disabled={busy} className={pill}>Status <ChevronUp className=\"size-3.5 text-muted\" /></button>\n </DropdownMenuTrigger>\n <DropdownMenuContent side=\"top\" className=\"w-44\">\n {defs.map((d) => (\n <DropdownMenuItem key={d.id} onSelect={() => run({ status: d.id })}>\n <StatusIcon status={d.id} /> {d.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button type=\"button\" disabled={busy} className={pill}><FolderInput className=\"size-3.5 text-muted\" /> Epic <ChevronUp className=\"size-3.5 text-muted\" /></button>\n </DropdownMenuTrigger>\n <DropdownMenuContent side=\"top\" className=\"max-h-72 w-64 overflow-y-auto\">\n {epics.map((e) => (\n <DropdownMenuItem key={e.id} onSelect={() => run({ epic: e.id })}>\n <span className=\"font-mono text-[11px] text-muted\">{e.id}</span> <span className=\"truncate\">{e.title}</span>\n </DropdownMenuItem>\n ))}\n {epics.length > 0 && <DropdownMenuSeparator />}\n <DropdownMenuItem onSelect={() => run({ epic: null })}>No epic</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n <button type=\"button\" disabled={busy} onClick={remove} className={`${pill} text-danger hover:text-danger`}>\n <Trash2 className=\"size-3.5\" /> Delete\n </button>\n <button type=\"button\" aria-label=\"Clear selection\" onClick={onClear} className=\"grid size-8 place-items-center rounded-md text-muted hover:bg-surface hover:text-txt\">\n <X className=\"size-4\" />\n </button>\n </div>\n )\n}\n","\"use client\"\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\"\nimport { useSearchParams } from \"next/navigation\"\nimport { Plus } from \"lucide-react\"\nimport type { ActivityEvent, Task } from \"@/types\"\nimport { useApp } from \"@/context/AppContext\"\nimport { useChats } from \"@/context/ChatContext\"\nimport { shouldHandleShortcut } from \"@/lib/shortcuts\"\nimport {\n DEFAULT_VIEWS, applyView, epicOf, fromParams, isDirty, toParams, type SavedView, type ViewState,\n} from \"@/lib/board-views\"\nimport { ViewBar } from \"./views/ViewBar\"\nimport { ViewToolbar } from \"./views/ViewToolbar\"\nimport { BoardView } from \"./views/BoardView\"\nimport { TableView } from \"./views/TableView\"\nimport { EpicView } from \"./views/EpicView\"\nimport TimelineView from \"./views/TimelineView\"\nimport { BulkBar } from \"./BulkBar\"\n\ninterface BoardTabProps {\n tasks: Task[]\n onMoveTask: (id: string, status: string) => void\n onOpenTask: (task: Task) => void\n onNewTask: () => void\n}\n\nconst BUILT_IN = DEFAULT_VIEWS.map((v) => v.id)\n/** URL keys that carry view state (toParams / fromParams); `v` names the active saved view. */\nconst STATE_KEYS = [\"view\", \"g\", \"sg\", \"s\", \"f\", \"q\", \"p\", \"sc\"]\nconst SEARCH_ID = \"board-search\"\n\nconst stateOf = ({ id: _id, name: _name, ...s }: SavedView): ViewState => s\nconst slug = (name: string) => name.toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\").slice(0, 30) || \"view\"\nconst newId = (name: string) => `${slug(name)}-${Math.random().toString(36).slice(2, 6)}`\n\n/** Built-ins first (a saved copy replaces the default), then custom views in saved order. */\nfunction withBuiltIns(saved: SavedView[]): SavedView[] {\n const byId = new Map(saved.map((v) => [v.id, v]))\n return [...DEFAULT_VIEWS.map((d) => byId.get(d.id) ?? d), ...saved.filter((v) => !BUILT_IN.includes(v.id))]\n}\n\n/** A built-in that differs from its code default (so it is saved, and can be restored). */\nfunction customized(v: SavedView): boolean {\n const d = DEFAULT_VIEWS.find((x) => x.id === v.id)\n return !!d && (v.name !== d.name || isDirty(stateOf(v), d))\n}\n\nexport function BoardTab({ tasks, onMoveTask, onOpenTask, onNewTask }: BoardTabProps) {\n const { rootParam } = useApp()\n const { agents } = useChats()\n const params = useSearchParams()\n const [views, setViews] = useState<SavedView[]>(DEFAULT_VIEWS)\n const [filterOpen, setFilterOpen] = useState(false)\n const [events, setEvents] = useState<ActivityEvent[]>([])\n const [eventsLoading, setEventsLoading] = useState(false)\n const [picked, setPicked] = useState<Set<string>>(new Set())\n\n // ── Saved views (.vibedoc/views.json) ───────────────────────────────────────\n const loadViews = useCallback(() => {\n fetch(`/api/views${rootParam}`)\n .then((r) => (r.ok ? r.json() : Promise.reject(new Error(`HTTP ${r.status}`))))\n .then((d: { views?: SavedView[] }) => setViews(withBuiltIns(d.views ?? [])))\n .catch((e) => console.warn(\"[vibedoc] could not load views:\", e))\n }, [rootParam])\n useEffect(() => {\n loadViews()\n const onSse = (e: Event) => { if ((e as CustomEvent<{ type?: string }>).detail?.type === \"views_updated\") loadViews() }\n window.addEventListener(\"vibedoc:sse\", onSse)\n return () => window.removeEventListener(\"vibedoc:sse\", onSse)\n }, [loadViews])\n\n // Unchanged built-ins stay out of views.json so later changes to DEFAULT_VIEWS still reach this project.\n const persist = useCallback((next: SavedView[]) => {\n setViews(next)\n const body = { views: next.filter((v) => !BUILT_IN.includes(v.id) || customized(v)) }\n fetch(`/api/views${rootParam}`, { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify(body) })\n .then((r) => { if (!r.ok) throw new Error(`HTTP ${r.status}`) })\n .catch((e) => { console.warn(\"[vibedoc] could not save views:\", e); loadViews() })\n }, [rootParam, loadViews])\n\n // ── Live state = the URL. No view keys → the active saved view's state. ─────\n const vParam = params.get(\"v\")\n const explicit = STATE_KEYS.some((k) => params.has(k))\n const key = params.toString()\n // Keyed on the query string so `state` (and every view's memo on it) keeps its identity between URL changes.\n const urlState = useMemo(() => fromParams(new URLSearchParams(key)), [key])\n const active = views.find((v) => v.id === vParam) ?? views.find((v) => v.id === urlState.kind) ?? views[0]\n const state: ViewState = useMemo(() => (explicit ? urlState : stateOf(active)), [explicit, urlState, active])\n const dirty = isDirty(state, active)\n\n // Native replaceState syncs useSearchParams without a server round trip (search typing stays smooth).\n const writeUrl = useCallback((id: string, next: ViewState | null) => {\n const p = new URLSearchParams(window.location.search)\n for (const k of [...STATE_KEYS, \"v\"]) p.delete(k)\n p.set(\"v\", id)\n if (next) {\n const sp = toParams(next)\n // An empty set would read back as the saved view; name the kind so the default state sticks.\n if (![...sp.keys()].length) sp.set(\"view\", next.kind)\n sp.forEach((val, k) => p.set(k, val))\n }\n window.history.replaceState(null, \"\", `${window.location.pathname}?${p}`)\n }, [])\n\n const setState = (next: ViewState) => writeUrl(active.id, next)\n const select = useCallback((id: string) => {\n setFilterOpen(false)\n const nextKind = views.find((v) => v.id === id)?.kind\n const body = document.querySelector<HTMLElement>(\"[data-board-view]\")\n if (!nextKind || !body || !(\"startViewTransition\" in document)) { writeUrl(id, null); return }\n // The URL syncs into React asynchronously, so hold the transition until the new view is on screen (max 300ms)\n document.startViewTransition(() => new Promise<void>((resolve) => {\n const done = () => { observer.disconnect(); clearTimeout(timer); resolve() }\n const observer = new MutationObserver(() => { if (body.dataset.boardView === nextKind) done() })\n const timer = setTimeout(done, 300)\n observer.observe(body, { attributes: true, attributeFilter: [\"data-board-view\"] })\n writeUrl(id, null)\n if (body.dataset.boardView === nextKind) done()\n }))\n }, [writeUrl, views])\n\n const saveAs = (name: string) => {\n const id = newId(name)\n persist([...views, { ...state, q: \"\", id, name }])\n writeUrl(id, null)\n }\n const save = () => persist(views.map((v) => (v.id === active.id ? { ...state, q: \"\", id: v.id, name: v.name } : v)))\n const rename = (id: string, name: string) => persist(views.map((v) => (v.id === id ? { ...v, name } : v)))\n const restore = (id: string) => {\n const d = DEFAULT_VIEWS.find((x) => x.id === id)\n if (!d) return\n persist(views.map((v) => (v.id === id ? d : v)))\n writeUrl(id, null)\n }\n const remove = (id: string) => {\n const v = views.find((x) => x.id === id)\n if (!v || !window.confirm(`Delete the view \"${v.name}\"? Tasks are not affected.`)) return false\n persist(views.filter((x) => x.id !== id))\n if (active.id === id) writeUrl(v.kind, null)\n return true\n }\n\n // ── Data ────────────────────────────────────────────────────────────────────\n const agentTasks = useMemo(\n () => new Set(Object.keys(agents).filter((k) => k.startsWith(\"task:\")).map((k) => k.slice(5))),\n [agents],\n )\n const shown = useMemo(() => applyView(tasks, state, { agentTasks }), [tasks, state, agentTasks])\n const epics = useMemo(() => {\n const m = new Map<string, { id: string; title: string; open: boolean }>()\n for (const t of tasks) {\n const e = epicOf(t.phase)\n if (!e.id) continue\n const cur = m.get(e.id) ?? { id: e.id, title: e.title, open: false }\n if (!cur.title) cur.title = e.title\n if (t.status !== \"done\" && t.status !== \"cancelled\") cur.open = true\n m.set(e.id, cur)\n }\n return [...m.values()].sort((a, b) => a.id.localeCompare(b.id, undefined, { numeric: true }))\n }, [tasks])\n\n const timeline = state.kind === \"timeline\"\n useEffect(() => {\n if (!timeline) return\n let alive = true\n const load = () => {\n setEventsLoading(true)\n fetch(`/api/activity${rootParam}&limit=2000`)\n .then((r) => (r.ok ? r.json() : Promise.reject(new Error(`HTTP ${r.status}`))))\n .then((d: ActivityEvent[]) => { if (alive) setEvents(Array.isArray(d) ? d : []) })\n .catch((e) => console.warn(\"[vibedoc] could not load activity:\", e))\n .finally(() => { if (alive) setEventsLoading(false) })\n }\n const onSse = (e: Event) => {\n const type = (e as CustomEvent<{ type?: string }>).detail?.type\n if (type !== \"chat_saved\" && type !== \"views_updated\") load()\n }\n load()\n window.addEventListener(\"vibedoc:sse\", onSse)\n return () => { alive = false; window.removeEventListener(\"vibedoc:sse\", onSse) }\n }, [timeline, rootParam])\n\n // ── Keys (board page only): v next view, 1–4 built-ins, f filter, n new task ─\n const order = views.map((v) => v.id).join(\",\")\n const activeId = active.id\n useEffect(() => {\n function onKey(e: KeyboardEvent) {\n if (!shouldHandleShortcut(e) || document.querySelector(\"[role=dialog]\")) return\n const n = Number(e.key)\n const ids = order.split(\",\")\n if (e.key === \"v\") select(ids[(ids.indexOf(activeId) + 1) % ids.length])\n else if (n >= 1 && n <= 4) select(BUILT_IN[n - 1])\n else if (e.key === \"f\") setFilterOpen(true)\n else if (e.key === \"n\") onNewTask()\n else return\n e.preventDefault()\n }\n window.addEventListener(\"keydown\", onKey)\n return () => window.removeEventListener(\"keydown\", onKey)\n }, [order, activeId, select, onNewTask])\n\n // Only tasks still on screen count as selected (a filter or a delete drops the rest)\n const selected = useMemo(() => new Set(shown.map((t) => t.id).filter((id) => picked.has(id))), [shown, picked])\n const toggleSelect = useCallback((ids: string[], on?: boolean) => setPicked((prev) => {\n const next = new Set(prev)\n for (const id of ids) {\n if (on ?? !next.has(id)) next.add(id)\n else next.delete(id)\n }\n return next\n }), [])\n const clearSelection = useCallback(() => setPicked(new Set()), [])\n useEffect(() => {\n if (selected.size === 0) return\n const onKey = (e: KeyboardEvent) => { if (e.key === \"Escape\" && !document.querySelector(\"[role=dialog],[role=menu]\")) clearSelection() }\n window.addEventListener(\"keydown\", onKey)\n return () => window.removeEventListener(\"keydown\", onKey)\n }, [selected.size, clearSelection])\n\n const count = (...s: Task[\"status\"][]) => tasks.filter((t) => s.includes(t.status)).length\n const viewProps = { tasks: shown, allTasks: tasks, state, agentTasks, onOpenTask, selected, onToggleSelect: toggleSelect }\n\n return (\n <div className=\"flex min-w-0 flex-col\">\n <header className=\"flex items-end gap-6 px-4 pt-8 sm:px-8\">\n <div className=\"min-w-0 grow\">\n <h1 className=\"text-[1.6rem] leading-tight font-semibold tracking-[-0.02em] text-txt\">Board</h1>\n <p className=\"mt-2 text-[1.1rem] leading-snug font-semibold text-txt\">\n <span className=\"font-mono tabular-nums\">{count(\"todo\", \"in-progress\", \"review\", \"blocked\")}</span> open ·{\" \"}\n <span className=\"font-mono tabular-nums\">{count(\"in-progress\")}</span> in progress{\" \"}\n <span className=\"font-normal text-muted\">\n · <span className=\"font-mono tabular-nums\">{count(\"done\")}</span> done\n </span>\n </p>\n </div>\n <button\n type=\"button\"\n onClick={onNewTask}\n className=\"inline-flex h-8.5 shrink-0 items-center gap-1.5 whitespace-nowrap rounded-md bg-accent px-3 text-[13px] font-medium text-accent-fg transition-colors duration-(--duration-fast) ease-out-soft hover:bg-accent/90 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-bg\"\n >\n <Plus aria-hidden className=\"size-[15px]\" />\n New task\n <kbd className=\"rounded-sm border border-accent-fg/25 bg-accent-fg/15 px-1 py-0.5 font-mono text-[10px] leading-none max-sm:hidden\">n</kbd>\n </button>\n </header>\n\n <div className=\"mt-[18px] px-4 sm:px-8\">\n <ViewBar views={views} activeId={activeId} onSelect={select} onNew={() => saveAs(\"New view\")} onRename={rename} onDelete={remove}\n customizedIds={views.filter(customized).map((v) => v.id)} onRestore={restore} />\n </div>\n <div className=\"px-4 pt-3 sm:px-8\">\n <ViewToolbar\n state={state}\n onChange={setState}\n epics={epics}\n dirty={dirty}\n activeIsBuiltIn={BUILT_IN.includes(activeId)}\n onSave={save}\n onSaveAs={saveAs}\n onReset={() => select(activeId)}\n searchInputId={SEARCH_ID}\n filterOpen={filterOpen}\n onFilterOpenChange={setFilterOpen}\n />\n </div>\n\n <div data-board-view={state.kind} className=\"[view-transition-name:board-view-body]\">\n {state.kind === \"epic\" ? (\n <EpicView {...viewProps} />\n ) : (\n <div className=\"min-w-0 px-4 pt-[18px] pb-8 sm:px-8\">\n {state.kind === \"board\" && <BoardView {...viewProps} onMoveTask={onMoveTask} />}\n {state.kind === \"table\" && <TableView {...viewProps} onSort={(sorts) => setState({ ...state, sorts })} />}\n {timeline && (\n <TimelineView {...viewProps} events={events} loading={eventsLoading} onScale={(scale) => setState({ ...state, scale })} />\n )}\n </div>\n )}\n </div>\n {selected.size > 0 && <BulkBar ids={[...selected]} onClear={clearSelection} />}\n </div>\n )\n}\n","\"use client\"\n\nimport { useState, useEffect } from \"react\"\nimport * as Dialog from \"@radix-ui/react-dialog\"\nimport { X, Plus, Loader2 } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\n\ninterface NewTaskModalProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n rootParam: string\n onTaskCreated: () => void\n}\n\nconst SIZE_OPTIONS = [\n { value: \"XS (< 1 hr)\", label: \"XS — under 1 hr\" },\n { value: \"S (1-2 hrs)\", label: \"S — 1–2 hrs\" },\n { value: \"M (3-4 hrs)\", label: \"M — 3–4 hrs\" },\n { value: \"L (5-8 hrs)\", label: \"L — 5–8 hrs\" },\n { value: \"XL (> 1 day)\", label: \"XL — over a day\" },\n]\n\nexport function NewTaskModal({ open, onOpenChange, rootParam, onTaskCreated }: NewTaskModalProps) {\n const [title, setTitle] = useState(\"\")\n const [phase, setPhase] = useState(\"\")\n const [size, setSize] = useState(\"\")\n const [description, setDescription] = useState(\"\")\n const [dependsOn, setDependsOn] = useState(\"\")\n const [error, setError] = useState(\"\")\n const [creating, setCreating] = useState(false)\n\n useEffect(() => {\n if (open) {\n setTitle(\"\")\n setPhase(\"\")\n setSize(\"\")\n setDescription(\"\")\n setDependsOn(\"\")\n setError(\"\")\n setCreating(false)\n }\n }, [open])\n\n async function handleSubmit(e: React.FormEvent) {\n e.preventDefault()\n if (!title.trim()) { setError(\"Title is required\"); return }\n\n setCreating(true)\n setError(\"\")\n\n try {\n const res = await fetch(`/api/tasks/create${rootParam}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n title: title.trim(),\n phase: phase.trim() || undefined,\n size: size || undefined,\n description: description.trim() || undefined,\n dependsOn: dependsOn.trim() || undefined,\n }),\n })\n\n if (!res.ok) {\n const data = await res.json()\n setError(data.error ?? \"Failed to create task\")\n setCreating(false)\n return\n }\n\n setCreating(false)\n onTaskCreated()\n onOpenChange(false)\n } catch {\n setError(\"Network error — please try again\")\n setCreating(false)\n }\n }\n\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"fixed inset-0 z-50 bg-black/60\" />\n <Dialog.Content className=\"fixed z-50 top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-full max-w-lg bg-surface border border-border rounded-xl shadow-2xl\">\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-border\">\n <Dialog.Title className=\"font-semibold text-txt\">New Task</Dialog.Title>\n <Dialog.Close className=\"text-muted hover:text-txt transition-colors\">\n <X className=\"w-4 h-4\" />\n </Dialog.Close>\n </div>\n\n <form onSubmit={handleSubmit} className=\"p-5 space-y-4\">\n <div className=\"space-y-1.5\">\n <label className=\"block text-xs font-medium text-muted uppercase tracking-wide\">\n Title <span className=\"text-danger\">*</span>\n </label>\n <input\n autoFocus\n type=\"text\"\n value={title}\n onChange={e => setTitle(e.target.value)}\n placeholder=\"e.g. Add drag-and-drop to kanban\"\n className=\"w-full px-3 py-2 bg-surface2 border border-border rounded-lg text-sm text-txt placeholder:text-muted focus:outline-hidden focus:border-accent transition-colors\"\n />\n </div>\n\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"space-y-1.5\">\n <label className=\"block text-xs font-medium text-muted uppercase tracking-wide\">Phase</label>\n <input\n type=\"text\"\n value={phase}\n onChange={e => setPhase(e.target.value)}\n placeholder=\"e.g. 1 — Core\"\n className=\"w-full px-3 py-2 bg-surface2 border border-border rounded-lg text-sm text-txt placeholder:text-muted focus:outline-hidden focus:border-accent transition-colors\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"block text-xs font-medium text-muted uppercase tracking-wide\">Size</label>\n <select\n value={size}\n onChange={e => setSize(e.target.value)}\n className=\"w-full px-3 py-2 bg-surface2 border border-border rounded-lg text-sm text-txt focus:outline-hidden focus:border-accent transition-colors\"\n >\n <option value=\"\">—</option>\n {SIZE_OPTIONS.map(o => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n </div>\n </div>\n\n <div className=\"space-y-1.5\">\n <label className=\"block text-xs font-medium text-muted uppercase tracking-wide\">Depends on</label>\n <input\n type=\"text\"\n value={dependsOn}\n onChange={e => setDependsOn(e.target.value)}\n placeholder=\"e.g. T001, T003\"\n className=\"w-full px-3 py-2 bg-surface2 border border-border rounded-lg text-sm text-txt placeholder:text-muted focus:outline-hidden focus:border-accent transition-colors\"\n />\n </div>\n\n <div className=\"space-y-1.5\">\n <label className=\"block text-xs font-medium text-muted uppercase tracking-wide\">Description</label>\n <textarea\n value={description}\n onChange={e => setDescription(e.target.value)}\n placeholder=\"What needs to be built?\"\n rows={3}\n className=\"w-full px-3 py-2 bg-surface2 border border-border rounded-lg text-sm text-txt placeholder:text-muted focus:outline-hidden focus:border-accent transition-colors resize-none\"\n />\n </div>\n\n {error && (\n <p className=\"text-sm text-danger\">{error}</p>\n )}\n\n <div className=\"flex items-center justify-end gap-2 pt-1\">\n <Dialog.Close\n type=\"button\"\n className=\"px-4 py-2 text-sm text-muted hover:text-txt transition-colors\"\n >\n Cancel\n </Dialog.Close>\n <button\n type=\"submit\"\n disabled={creating || !title.trim()}\n className={cn(\n \"flex items-center gap-2 px-4 py-2 rounded-lg text-sm font-medium transition-colors\",\n \"bg-accent text-accent-fg hover:bg-accent/90 disabled:opacity-50 disabled:cursor-not-allowed\"\n )}\n >\n {creating ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Plus className=\"w-4 h-4\" />}\n {creating ? \"Creating…\" : \"Create Task\"}\n </button>\n </div>\n </form>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\n","\"use client\"\n\nimport { Suspense, useMemo, useState } from \"react\"\nimport { useRouter, useSearchParams } from \"next/navigation\"\nimport { useApp } from \"@/context/AppContext\"\nimport { BoardTab } from \"@/components/board/BoardTab\"\nimport { TaskDetailPanel } from \"@/components/board/TaskDetailPanel\"\nimport { NewTaskModal } from \"@/components/board/NewTaskModal\"\nimport type { Task } from \"@/types\"\n\nexport default function BoardPage() {\n return (\n <Suspense>\n <BoardPageInner />\n </Suspense>\n )\n}\n\nfunction BoardPageInner() {\n const { board, moveTask, refresh, rootParam } = useApp()\n const router = useRouter()\n const [selectedId, setSelectedId] = useState<string | null>(null)\n // ?task=T055 (links from a chat) opens that task; adjusted during render so a new link re-opens it\n const taskParam = useSearchParams().get(\"task\")\n const [seenTaskParam, setSeenTaskParam] = useState<string | null>(null)\n if (board && taskParam !== seenTaskParam) {\n setSeenTaskParam(taskParam)\n if (taskParam && Object.values(board).flat().some((t) => t.id === taskParam)) setSelectedId(taskParam)\n }\n const [newTaskOpen, setNewTaskOpen] = useState(false)\n // Drop only ?task=: the rest of the query is the live board view\n const closeTaskParam = () => {\n const p = new URLSearchParams(window.location.search)\n p.delete(\"task\")\n router.replace(p.size ? `/board?${p}` : \"/board\", { scroll: false })\n }\n\n const tasks = useMemo(() => (board ? Object.values(board).flat() : []), [board])\n // derived from the board so edits show live and a deleted task closes the panel\n const selectedTask = tasks.find((t) => t.id === selectedId) ?? null\n\n if (!board) return null\n\n return (\n <div className=\"relative min-w-0 flex-1\">\n <BoardTab\n tasks={tasks}\n onMoveTask={moveTask}\n onOpenTask={(t: Task) => setSelectedId(t.id)}\n onNewTask={() => setNewTaskOpen(true)}\n />\n <TaskDetailPanel\n task={selectedTask}\n onClose={() => { setSelectedId(null); if (taskParam) closeTaskParam() }}\n onMove={moveTask}\n />\n <NewTaskModal\n open={newTaskOpen}\n onOpenChange={setNewTaskOpen}\n rootParam={rootParam}\n onTaskCreated={refresh}\n />\n </div>\n )\n}\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'chevron-up',\n size: 24,\n node: [['path', { d: 'm18 15-6-6-6 6', key: '153udz' }]],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\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(__iconData);\n\nexport default ChevronUp;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'rotate-ccw',\n size: 24,\n node: [\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 ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name RotateCcw\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyAxMmE5IDkgMCAxIDAgOS05IDkuNzUgOS43NSAwIDAgMC02Ljc0IDIuNzRMMyA4IiAvPgogIDxwYXRoIGQ9Ik0zIDN2NWg1IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/rotate-ccw\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 RotateCcw = createLucideIcon(__iconData);\n\nexport default RotateCcw;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'sliders-horizontal',\n size: 24,\n node: [\n ['path', { d: 'M10 5H3', key: '1qgfaw' }],\n ['path', { d: 'M12 19H3', key: 'yhmn1j' }],\n ['path', { d: 'M14 3v4', key: '1sua03' }],\n ['path', { d: 'M16 17v4', key: '1q0r14' }],\n ['path', { d: 'M21 12h-9', key: '1o4lsq' }],\n ['path', { d: 'M21 19h-5', key: '1rlt1p' }],\n ['path', { d: 'M21 5h-7', key: '1oszz2' }],\n ['path', { d: 'M8 10v4', key: 'tgpxqk' }],\n ['path', { d: 'M8 12H3', key: 'a7s4jb' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name SlidersHorizontal\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAgNUgzIiAvPgogIDxwYXRoIGQ9Ik0xMiAxOUgzIiAvPgogIDxwYXRoIGQ9Ik0xNCAzdjQiIC8+CiAgPHBhdGggZD0iTTE2IDE3djQiIC8+CiAgPHBhdGggZD0iTTIxIDEyaC05IiAvPgogIDxwYXRoIGQ9Ik0yMSAxOWgtNSIgLz4KICA8cGF0aCBkPSJNMjEgNWgtNyIgLz4KICA8cGF0aCBkPSJNOCAxMHY0IiAvPgogIDxwYXRoIGQ9Ik04IDEySDMiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/sliders-horizontal\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 SlidersHorizontal = createLucideIcon(__iconData);\n\nexport default SlidersHorizontal;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'rows-3',\n size: 24,\n node: [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', key: 'afitv7' }],\n ['path', { d: 'M21 9H3', key: '1338ky' }],\n ['path', { d: 'M21 15H3', key: '9uk58r' }],\n ],\n aliases: ['panels-top-bottom'],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Rows3\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiAvPgogIDxwYXRoIGQ9Ik0yMSA5SDMiIC8+CiAgPHBhdGggZD0iTTIxIDE1SDMiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/rows-3\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 Rows3 = createLucideIcon(__iconData);\n\nexport default Rows3;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'square-kanban',\n size: 24,\n node: [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', key: 'afitv7' }],\n ['path', { d: 'M8 7v7', key: '1x2jlm' }],\n ['path', { d: 'M12 7v4', key: 'xawao1' }],\n ['path', { d: 'M16 7v9', key: '1hp2iy' }],\n ],\n aliases: ['kanban-square'],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name SquareKanban\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiAvPgogIDxwYXRoIGQ9Ik04IDd2NyIgLz4KICA8cGF0aCBkPSJNMTIgN3Y0IiAvPgogIDxwYXRoIGQ9Ik0xNiA3djkiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/square-kanban\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 SquareKanban = createLucideIcon(__iconData);\n\nexport default SquareKanban;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'panel-right-open',\n size: 24,\n node: [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', key: 'afitv7' }],\n ['path', { d: 'M15 3v18', key: '14nvp0' }],\n ['path', { d: 'm10 15-3-3 3-3', key: '1pgupc' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name PanelRightOpen\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiAvPgogIDxwYXRoIGQ9Ik0xNSAzdjE4IiAvPgogIDxwYXRoIGQ9Im0xMCAxNS0zLTMgMy0zIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/panel-right-open\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 PanelRightOpen = createLucideIcon(__iconData);\n\nexport default PanelRightOpen;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'arrow-up-down',\n size: 24,\n node: [\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};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\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(__iconData);\n\nexport default ArrowUpDown;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'table-2',\n size: 24,\n node: [\n ['path', { d: 'M3 9h18', key: '1pudct' }],\n ['path', { d: 'M9 3v18', key: 'fh3hqa' }],\n ['rect', { x: '3', y: '3', width: '18', height: '18', rx: '2', key: 'h1oib' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Table2\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyA5aDE4IiAvPgogIDxwYXRoIGQ9Ik05IDN2MTgiIC8+CiAgPHJlY3QgeD0iMyIgeT0iMyIgd2lkdGg9IjE4IiBoZWlnaHQ9IjE4IiByeD0iMiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/table-2\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 Table2 = createLucideIcon(__iconData);\n\nexport default Table2;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'corner-down-right',\n size: 24,\n node: [\n ['path', { d: 'm15 10 5 5-5 5', key: 'qqa56n' }],\n ['path', { d: 'M4 4v7a4 4 0 0 0 4 4h12', key: 'z08zvw' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name CornerDownRight\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTUgMTAgNSA1LTUgNSIgLz4KICA8cGF0aCBkPSJNNCA0djdhNCA0IDAgMCAwIDQgNGgxMiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/corner-down-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 CornerDownRight = createLucideIcon(__iconData);\n\nexport default CornerDownRight;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'play',\n size: 24,\n node: [\n [\n 'path',\n {\n d: 'M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z',\n key: '10ikf1',\n },\n ],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Play\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNSA1YTIgMiAwIDAgMSAzLjAwOC0xLjcyOGwxMS45OTcgNi45OThhMiAyIDAgMCAxIC4wMDMgMy40NThsLTEyIDdBMiAyIDAgMCAxIDUgMTl6IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/play\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 Play = createLucideIcon(__iconData);\n\nexport default Play;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'bookmark',\n size: 24,\n node: [\n [\n 'path',\n {\n d: 'M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z',\n key: 'oz39mx',\n },\n ],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name Bookmark\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTcgM2EyIDIgMCAwIDEgMiAydjE1YTEgMSAwIDAgMS0xLjQ5Ni44NjhsLTQuNTEyLTIuNTc4YTIgMiAwIDAgMC0xLjk4NCAwbC00LjUxMiAyLjU3OEExIDEgMCAwIDEgNSAyMFY1YTIgMiAwIDAgMSAyLTJ6IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/bookmark\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 Bookmark = createLucideIcon(__iconData);\n\nexport default Bookmark;\n","import createLucideIcon from '../createLucideIcon';\nimport type { LucideIconNode, LucideIconData } from '../types';\n\nexport const __iconData: LucideIconData = {\n name: 'chart-gantt',\n size: 24,\n node: [\n ['path', { d: 'M10 6h8', key: 'zvc2xc' }],\n ['path', { d: 'M12 16h6', key: 'yi5mkt' }],\n ['path', { d: 'M3 3v16a2 2 0 0 0 2 2h16', key: 'c24i48' }],\n ['path', { d: 'M8 11h7', key: 'wz2hg0' }],\n ],\n};\n\n/**\n * @deprecated Access `__iconData` instead.\n */\nexport const __iconNode: LucideIconNode[] = __iconData.node;\n\n/**\n * @component @name ChartGantt\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAgNmg4IiAvPgogIDxwYXRoIGQ9Ik0xMiAxNmg2IiAvPgogIDxwYXRoIGQ9Ik0zIDN2MTZhMiAyIDAgMCAwIDIgMmgxNiIgLz4KICA8cGF0aCBkPSJNOCAxMWg3IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/chart-gantt\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 ChartGantt = createLucideIcon(__iconData);\n\nexport default ChartGantt;\n"],"names":["Bookmark"],"mappings":"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","ignoreList":[11,12,13,14,15,16,17,18,19,20,21,22]}