@band-app/server 0.30.1 → 0.31.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 (154) hide show
  1. package/dist/client/assets/{TerminalPanel-CYc7wmeE.js → TerminalPanel-B7w-MXq6.js} +1 -1
  2. package/dist/client/assets/{_basePickBy-DSFTNllf.js → _basePickBy-MOPnIDNU.js} +1 -1
  3. package/dist/client/assets/{_baseUniq-DnkIfali.js → _baseUniq-Dvgd7LC-.js} +1 -1
  4. package/dist/client/assets/{arc-yqr-IZtS.js → arc-CLKtuYIQ.js} +1 -1
  5. package/dist/client/assets/{architectureDiagram-VXUJARFQ-DgI9TKhb.js → architectureDiagram-VXUJARFQ-2uXtcrIY.js} +1 -1
  6. package/dist/client/assets/{blockDiagram-VD42YOAC-BGOVIb7o.js → blockDiagram-VD42YOAC-BVsh28c_.js} +1 -1
  7. package/dist/client/assets/{c4Diagram-YG6GDRKO-iztuATa5.js → c4Diagram-YG6GDRKO-7c05Vgq2.js} +1 -1
  8. package/dist/client/assets/channel-C3O7_aZ0.js +1 -0
  9. package/dist/client/assets/{chunk-4BX2VUAB-CcUWoJOh.js → chunk-4BX2VUAB-BE-3fdKG.js} +1 -1
  10. package/dist/client/assets/{chunk-55IACEB6-CLZYywVn.js → chunk-55IACEB6-BHogGWxY.js} +1 -1
  11. package/dist/client/assets/{chunk-B4BG7PRW-DjGod5fi.js → chunk-B4BG7PRW-vTUbHTLu.js} +1 -1
  12. package/dist/client/assets/{chunk-DI55MBZ5-rvGroe_f.js → chunk-DI55MBZ5-CZc3Izff.js} +1 -1
  13. package/dist/client/assets/{chunk-FMBD7UC4-DaPnkf6C.js → chunk-FMBD7UC4-DJ2VRMnr.js} +1 -1
  14. package/dist/client/assets/{chunk-QN33PNHL-0f_dQb97.js → chunk-QN33PNHL-fRdq2MR_.js} +1 -1
  15. package/dist/client/assets/{chunk-QZHKN3VN-V5my3DmE.js → chunk-QZHKN3VN-CuEMRzZD.js} +1 -1
  16. package/dist/client/assets/{chunk-TZMSLE5B-BtkkmYb5.js → chunk-TZMSLE5B-D72a0Zdw.js} +1 -1
  17. package/dist/client/assets/classDiagram-2ON5EDUG-BoiZPwoN.js +1 -0
  18. package/dist/client/assets/classDiagram-v2-WZHVMYZB-BoiZPwoN.js +1 -0
  19. package/dist/client/assets/clone-lHwRbEeN.js +1 -0
  20. package/dist/client/assets/{cose-bilkent-S5V4N54A-Cmx6KOyO.js → cose-bilkent-S5V4N54A-BKtPu1zs.js} +1 -1
  21. package/dist/client/assets/{dagre-6UL2VRFP-Bka4HPUz.js → dagre-6UL2VRFP-B9QQeVOI.js} +1 -1
  22. package/dist/client/assets/{diagram-PSM6KHXK-CD7rmMsc.js → diagram-PSM6KHXK-B8HYQLMw.js} +1 -1
  23. package/dist/client/assets/{diagram-QEK2KX5R-oiADiv14.js → diagram-QEK2KX5R-ComYD9MH.js} +1 -1
  24. package/dist/client/assets/{diagram-S2PKOQOG-B4Uae-nx.js → diagram-S2PKOQOG-BY9m2nHh.js} +1 -1
  25. package/dist/client/assets/{erDiagram-Q2GNP2WA-BvFMCk4I.js → erDiagram-Q2GNP2WA-BNvaDjit.js} +1 -1
  26. package/dist/client/assets/{flowDiagram-NV44I4VS-BTNbN1IS.js → flowDiagram-NV44I4VS-Ddpvl-vl.js} +1 -1
  27. package/dist/client/assets/{ganttDiagram-JELNMOA3-oGw7ex14.js → ganttDiagram-JELNMOA3-DtLpVIoc.js} +1 -1
  28. package/dist/client/assets/{gitGraphDiagram-V2S2FVAM-ANBYCIGh.js → gitGraphDiagram-V2S2FVAM-DQF0HBF1.js} +1 -1
  29. package/dist/client/assets/{graph-CcgcxFwc.js → graph-C781x5wO.js} +1 -1
  30. package/dist/client/assets/{highlighted-body-B3W2YXNL-CB6TXvrA.js → highlighted-body-B3W2YXNL-CiFHkG2b.js} +1 -1
  31. package/dist/client/assets/{index-CNK9CFgH.js → index-BBCldE3w.js} +1 -1
  32. package/dist/client/assets/{index-B6XNXoaL.js → index-BQJE_ylT.js} +1 -1
  33. package/dist/client/assets/{index-jADn9moZ.js → index-BQaxF9MG.js} +1 -1
  34. package/dist/client/assets/{index-CX6RhqKm.js → index-BR41myYB.js} +1 -1
  35. package/dist/client/assets/{index-D3oXjM3u.js → index-BTP6G260.js} +1 -1
  36. package/dist/client/assets/{index-BAmJ0GKU.js → index-BVLZtCO_.js} +1 -1
  37. package/dist/client/assets/{index-DbPjX4ZE.js → index-Bg6O6yab.js} +1 -1
  38. package/dist/client/assets/{index-CCYZ9TFO.js → index-C9uXadXD.js} +1 -1
  39. package/dist/client/assets/{index-AmFSOCK4.js → index-Ca5qw4bu.js} +1 -1
  40. package/dist/client/assets/{index-oktth6Eb.js → index-Co3FYAz1.js} +1 -1
  41. package/dist/client/assets/{index-DGfblNX8.js → index-CoD9Za6I.js} +1 -1
  42. package/dist/client/assets/{index-DbMvNJEz.js → index-CsCNs38S.js} +1 -1
  43. package/dist/client/assets/{index-DwfeHYo6.js → index-D8ecQsfM.js} +1 -1
  44. package/dist/client/assets/{index-DcH_gVmD.js → index-Dhu83XDb.js} +1 -1
  45. package/dist/client/assets/{index-DfpgVgGw.js → index-Dk3mw2MP.js} +1 -1
  46. package/dist/client/assets/{index-CCvSBgbq.js → index-Dmw4xB4j.js} +1 -1
  47. package/dist/client/assets/{index-DW6uLGze.js → index-DwZk_cus.js} +1 -1
  48. package/dist/client/assets/{index-UPQzA7yb.js → index-xIKGJ3n2.js} +1 -1
  49. package/dist/client/assets/{infoDiagram-HS3SLOUP-D90X75Z3.js → infoDiagram-HS3SLOUP-BMWXVFwl.js} +1 -1
  50. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-BgChwq0x.js → journeyDiagram-XKPGCS4Q-BI2_OL4h.js} +1 -1
  51. package/dist/client/assets/{kanban-definition-3W4ZIXB7-Di1Xrs0h.js → kanban-definition-3W4ZIXB7-DOsG8dYx.js} +1 -1
  52. package/dist/client/assets/{layout-BvXbPDLJ.js → layout-Bbvi54cd.js} +1 -1
  53. package/dist/client/assets/main-D_80GG4H.css +1 -0
  54. package/dist/client/assets/{main-DUGGQWmn.js → main-DraI_2WE.js} +225 -225
  55. package/dist/client/assets/{mindmap-definition-VGOIOE7T-CiiV7X0E.js → mindmap-definition-VGOIOE7T-D4Sd_Kfu.js} +1 -1
  56. package/dist/client/assets/{pieDiagram-ADFJNKIX-C5XzwLyG.js → pieDiagram-ADFJNKIX-C7h-nB1m.js} +1 -1
  57. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-BwkGtnp5.js → quadrantDiagram-AYHSOK5B-Dy596AJL.js} +1 -1
  58. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-BzEtQL4i.js → requirementDiagram-UZGBJVZJ-xscRQbHJ.js} +1 -1
  59. package/dist/client/assets/{sankeyDiagram-TZEHDZUN-BkqqCKr3.js → sankeyDiagram-TZEHDZUN-DCi7vP32.js} +1 -1
  60. package/dist/client/assets/{sequenceDiagram-WL72ISMW-D_gZ_Lt0.js → sequenceDiagram-WL72ISMW-qUhe9Cbc.js} +1 -1
  61. package/dist/client/assets/{stateDiagram-FKZM4ZOC-DEDS5Lv4.js → stateDiagram-FKZM4ZOC-DSmbkZ_d.js} +1 -1
  62. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-BsPlpajy.js +1 -0
  63. package/dist/client/assets/{timeline-definition-IT6M3QCI-DalCe-B5.js → timeline-definition-IT6M3QCI-C6Z_s_Vx.js} +1 -1
  64. package/dist/client/assets/{treemap-GDKQZRPO-CtoL0e4U.js → treemap-GDKQZRPO-Dn8bXpzH.js} +1 -1
  65. package/dist/client/assets/workspace._workspaceId-BMWfOwwz.js +1 -0
  66. package/dist/client/assets/{workspace._workspaceId-CouwLO7q.js → workspace._workspaceId-X6y8HU1f.js} +1 -1
  67. package/dist/client/assets/{xychartDiagram-PRI3JC2R-C3bXo21u.js → xychartDiagram-PRI3JC2R-Bo0o11Hv.js} +1 -1
  68. package/dist/openapi.json +37 -0
  69. package/dist/server/assets/{TerminalPanel-Br6bnerp.js → TerminalPanel-DwiK0a7O.js} +27 -24
  70. package/dist/server/assets/{_basePickBy-BbVdfJJx.js → _basePickBy-BI_h9zNZ.js} +2 -2
  71. package/dist/server/assets/{_baseUniq-DZlTc9mr.js → _baseUniq-BsVb1Z1a.js} +1 -1
  72. package/dist/server/assets/_tanstack-start-manifest_v-tp111Oi_.js +4 -0
  73. package/dist/server/assets/{arc-CI6FZKZK.js → arc-5WhmOOvK.js} +1 -1
  74. package/dist/server/assets/{architecture-7HQA4BMR-C5ydTPUl.js → architecture-7HQA4BMR-Cj4ZRaay.js} +6 -6
  75. package/dist/server/assets/{architectureDiagram-VXUJARFQ-5uniqAHc.js → architectureDiagram-VXUJARFQ-DkchSxdX.js} +6 -6
  76. package/dist/server/assets/{blockDiagram-VD42YOAC-ZfA3oZiS.js → blockDiagram-VD42YOAC-Dg_flni_.js} +6 -6
  77. package/dist/server/assets/{c4Diagram-YG6GDRKO-CIA5eVV6.js → c4Diagram-YG6GDRKO-DsFHmTD3.js} +2 -2
  78. package/dist/server/assets/{channel-Cx4VskGi.js → channel-CKjBHgWA.js} +1 -1
  79. package/dist/server/assets/{chunk-4BX2VUAB-Ded1GGo-.js → chunk-4BX2VUAB-BnMplOsV.js} +1 -1
  80. package/dist/server/assets/{chunk-55IACEB6-BwrewJPk.js → chunk-55IACEB6-BW3-4FCm.js} +1 -1
  81. package/dist/server/assets/{chunk-B4BG7PRW-6-52BPtW.js → chunk-B4BG7PRW-44B9JfnQ.js} +4 -4
  82. package/dist/server/assets/{chunk-DI55MBZ5-DFS2_qc9.js → chunk-DI55MBZ5-xUtiLewM.js} +3 -3
  83. package/dist/server/assets/{chunk-FMBD7UC4-CHuRNLFJ.js → chunk-FMBD7UC4-LQJJD-on.js} +1 -1
  84. package/dist/server/assets/{chunk-QN33PNHL-BvqSEFKx.js → chunk-QN33PNHL-Bz6JspT7.js} +1 -1
  85. package/dist/server/assets/{chunk-QZHKN3VN-BrGUOJtT.js → chunk-QZHKN3VN-CqbN5Hbm.js} +1 -1
  86. package/dist/server/assets/{chunk-TZMSLE5B-CM-vVEKG.js → chunk-TZMSLE5B-CLfUYKJu.js} +1 -1
  87. package/dist/server/assets/{classDiagram-v2-WZHVMYZB-vj4N4uTP.js → classDiagram-2ON5EDUG-CnPtqi4k.js} +5 -5
  88. package/dist/server/assets/{classDiagram-2ON5EDUG-vj4N4uTP.js → classDiagram-v2-WZHVMYZB-CnPtqi4k.js} +5 -5
  89. package/dist/server/assets/{clone-FpW231EY.js → clone-BBTPQ6Eb.js} +1 -1
  90. package/dist/server/assets/{cose-bilkent-S5V4N54A-KcHAEwzJ.js → cose-bilkent-S5V4N54A-B9ae2Qdn.js} +1 -1
  91. package/dist/server/assets/{dagre-6UL2VRFP-CQWT1qH1.js → dagre-6UL2VRFP-B7jTJSLw.js} +6 -6
  92. package/dist/server/assets/{diagram-PSM6KHXK-C522aWwF.js → diagram-PSM6KHXK-zpQZfPMx.js} +7 -7
  93. package/dist/server/assets/{diagram-QEK2KX5R-AmngkeIE.js → diagram-QEK2KX5R-CIAMWYgF.js} +6 -6
  94. package/dist/server/assets/{diagram-S2PKOQOG-BM39hxHa.js → diagram-S2PKOQOG-DmG_O45F.js} +6 -6
  95. package/dist/server/assets/{erDiagram-Q2GNP2WA-BKMMfe3p.js → erDiagram-Q2GNP2WA-eOuplDm8.js} +4 -4
  96. package/dist/server/assets/{flowDiagram-NV44I4VS-BfixH-Db.js → flowDiagram-NV44I4VS-D936EXJm.js} +5 -5
  97. package/dist/server/assets/{ganttDiagram-JELNMOA3-DFMW13wi.js → ganttDiagram-JELNMOA3-BiN9iSoE.js} +1 -1
  98. package/dist/server/assets/{gitGraph-G5XIXVHT-DCO9Wzl8.js → gitGraph-G5XIXVHT-CEvzHY0m.js} +6 -6
  99. package/dist/server/assets/{gitGraphDiagram-V2S2FVAM-CojxDa8_.js → gitGraphDiagram-V2S2FVAM-BySu09rG.js} +7 -7
  100. package/dist/server/assets/{graph-DX0Ld9Ij.js → graph-7Z3Uekg6.js} +2 -2
  101. package/dist/server/assets/{highlighted-body-B3W2YXNL-BRJTScpo.js → highlighted-body-B3W2YXNL-D96wFQIF.js} +1 -1
  102. package/dist/server/assets/{index-B70OKozW.js → index--KaT9H0k.js} +5 -5
  103. package/dist/server/assets/{index-1fKvU2GD.js → index-0NB-RPox.js} +2 -2
  104. package/dist/server/assets/{index-C9NLW19U.js → index-B2cRwRII.js} +2 -2
  105. package/dist/server/assets/{index-BPhNydFp.js → index-BJJ8j1rg.js} +2 -2
  106. package/dist/server/assets/{index-DsUEML0Q.js → index-BTtOxXlZ.js} +3 -3
  107. package/dist/server/assets/{index-BJCGggpH.js → index-BeVYh61F.js} +2 -2
  108. package/dist/server/assets/{index-CGahi9V_.js → index-BstlKcBR.js} +4 -4
  109. package/dist/server/assets/{index-BJtDnGxq.js → index-C2HXhI72.js} +2 -2
  110. package/dist/server/assets/{index-B0xGaLrl.js → index-C9azpIfZ.js} +3 -3
  111. package/dist/server/assets/{index-BFGzZbup.js → index-CIQ2H-15.js} +2 -2
  112. package/dist/server/assets/{index-Cd5puaI6.js → index-CTx1RpR6.js} +2 -2
  113. package/dist/server/assets/{index-DCgp2ft7.js → index-CdB_dmgU.js} +1 -1
  114. package/dist/server/assets/{index-C0OatepH.js → index-CvolrjMO.js} +2 -2
  115. package/dist/server/assets/{index-BD2aoqcU.js → index-DKHXjVjQ.js} +1 -1
  116. package/dist/server/assets/{index-BqzKD5E_.js → index-Dh1M5dNP.js} +2 -2
  117. package/dist/server/assets/{index-7EU1eTTa.js → index-OaYzTlpS.js} +2 -2
  118. package/dist/server/assets/{index-Cwe7nbJw.js → index-P4B7a8It.js} +2 -2
  119. package/dist/server/assets/{index-y8Aubw3W.js → index-a62bFj9q.js} +5 -5
  120. package/dist/server/assets/{info-VBDWY6EO-BUsqumC5.js → info-VBDWY6EO-KF3o2F_X.js} +6 -6
  121. package/dist/server/assets/{infoDiagram-HS3SLOUP--nKUIx4y.js → infoDiagram-HS3SLOUP-tw47oYSh.js} +5 -5
  122. package/dist/server/assets/{journeyDiagram-XKPGCS4Q-KjVGeKmm.js → journeyDiagram-XKPGCS4Q-dlsRbD68.js} +4 -4
  123. package/dist/server/assets/{kanban-definition-3W4ZIXB7-aISJLxn5.js → kanban-definition-3W4ZIXB7-BY-i-k2L.js} +2 -2
  124. package/dist/server/assets/{layout-CzeG7EPR.js → layout-CBNJVKY7.js} +4 -4
  125. package/dist/server/assets/{mermaid-3ZIDBTTL-BTOUM0ev.js → mermaid-3ZIDBTTL-OXquaWS7.js} +1 -1
  126. package/dist/server/assets/{mermaid-parser.core-BoGFLsBJ.js → mermaid-parser.core-BJPps3BL.js} +11 -11
  127. package/dist/server/assets/{mindmap-definition-VGOIOE7T--AIwUu6M.js → mindmap-definition-VGOIOE7T-BhmQKdg9.js} +3 -3
  128. package/dist/server/assets/{packet-DYOGHKS2-BTGkKC22.js → packet-DYOGHKS2-pVltsqVu.js} +6 -6
  129. package/dist/server/assets/{pie-VRWISCQL-BjDIbOyB.js → pie-VRWISCQL-Drk2bcq1.js} +6 -6
  130. package/dist/server/assets/{pieDiagram-ADFJNKIX-VNMmF9Za.js → pieDiagram-ADFJNKIX-CaxKfDJS.js} +7 -7
  131. package/dist/server/assets/{quadrantDiagram-AYHSOK5B-re6uOzo4.js → quadrantDiagram-AYHSOK5B-Ca2xEu2r.js} +1 -1
  132. package/dist/server/assets/{radar-ZZBFDIW7-bi1qVKOM.js → radar-ZZBFDIW7-ButuOJZN.js} +6 -6
  133. package/dist/server/assets/{requirementDiagram-UZGBJVZJ-BImsyUnt.js → requirementDiagram-UZGBJVZJ-Yu709R_p.js} +3 -3
  134. package/dist/server/assets/{router-B7-XKvBR.js → router-CijxukSe.js} +553 -246
  135. package/dist/server/assets/{sankeyDiagram-TZEHDZUN-BdxA5ccl.js → sankeyDiagram-TZEHDZUN-B-IfXZ0G.js} +1 -1
  136. package/dist/server/assets/{sequenceDiagram-WL72ISMW-De8W2AXi.js → sequenceDiagram-WL72ISMW-D1bV4VYq.js} +3 -3
  137. package/dist/server/assets/{stateDiagram-FKZM4ZOC-CslmqvhX.js → stateDiagram-FKZM4ZOC-vLFbsrNj.js} +8 -8
  138. package/dist/server/assets/{stateDiagram-v2-4FDKWEC3-BXVdfPdk.js → stateDiagram-v2-4FDKWEC3-BKTZFre2.js} +4 -4
  139. package/dist/server/assets/{timeline-definition-IT6M3QCI-BrEcv0X7.js → timeline-definition-IT6M3QCI-BoTxx0bm.js} +2 -2
  140. package/dist/server/assets/{treemap-GDKQZRPO-IZvjxjwq.js → treemap-GDKQZRPO-CAmm-Xwb.js} +6 -6
  141. package/dist/server/assets/{workspace._workspaceId-DSom1njg.js → workspace._workspaceId-C-QhWzy_.js} +2 -2
  142. package/dist/server/assets/{workspace._workspaceId-DMfwrjZz.js → workspace._workspaceId-DivWn3Sp.js} +1 -1
  143. package/dist/server/assets/{xychartDiagram-PRI3JC2R-B99wGKft.js → xychartDiagram-PRI3JC2R-XawkKMC7.js} +1 -1
  144. package/dist/server/server.js +2 -2
  145. package/dist/start-server.mjs +650 -363
  146. package/package.json +6 -4
  147. package/dist/client/assets/channel-BkKcGPNX.js +0 -1
  148. package/dist/client/assets/classDiagram-2ON5EDUG-31IVI--d.js +0 -1
  149. package/dist/client/assets/classDiagram-v2-WZHVMYZB-31IVI--d.js +0 -1
  150. package/dist/client/assets/clone-TmgJgLyY.js +0 -1
  151. package/dist/client/assets/main-CkQFvJn7.css +0 -1
  152. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-2jb1quoy.js +0 -1
  153. package/dist/client/assets/workspace._workspaceId-Tn_ATtTD.js +0 -1
  154. package/dist/server/assets/_tanstack-start-manifest_v-DKMimfmd.js +0 -4
@@ -14376,7 +14376,7 @@ function PopoverContent({
14376
14376
  align,
14377
14377
  sideOffset,
14378
14378
  className: cn$2(
14379
- "ease-out duration-150 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-hidden data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
14379
+ "ease-out duration-150 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md outline-hidden data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
14380
14380
  className
14381
14381
  ),
14382
14382
  ...props
@@ -14792,10 +14792,10 @@ function DialogOverlay({
14792
14792
  );
14793
14793
  }
14794
14794
  const DIALOG_CONTENT_VARIANTS = {
14795
- default: "ease-out fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 shadow-lg duration-200 outline-none data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 sm:max-w-lg",
14795
+ default: "ease-out fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border border-border bg-background p-6 shadow-lg duration-200 outline-none data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 sm:max-w-lg",
14796
14796
  "bottom-sheet": [
14797
14797
  // Shared
14798
- "ease-out fixed z-50 flex flex-col bg-background shadow-lg duration-200 outline-none",
14798
+ "ease-out fixed z-50 flex flex-col border-border bg-background shadow-lg duration-200 outline-none",
14799
14799
  "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0",
14800
14800
  // Mobile (< lg): bottom drawer
14801
14801
  "inset-x-0 bottom-0 w-full max-w-none rounded-t-2xl border border-b-0 p-6",
@@ -14807,7 +14807,7 @@ const DIALOG_CONTENT_VARIANTS = {
14807
14807
  ].join(" "),
14808
14808
  "command-palette": [
14809
14809
  // Shared
14810
- "fixed z-50 flex flex-col bg-background shadow-lg outline-none",
14810
+ "fixed z-50 flex flex-col border-border bg-background shadow-lg outline-none",
14811
14811
  // Mobile-only open/close animation: the drawer slide is touch-initiated.
14812
14812
  // Desktop (lg+) gets NO open/close animation — this is a keyboard-summoned
14813
14813
  // surface hit dozens of times a day; it must appear instantly.
@@ -14963,7 +14963,7 @@ function CommandInput({
14963
14963
  className,
14964
14964
  ...props
14965
14965
  }) {
14966
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center border-b px-3", "cmdk-input-wrapper": "", children: [
14966
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center border-b border-border px-3", "cmdk-input-wrapper": "", children: [
14967
14967
  /* @__PURE__ */ jsxRuntimeExports.jsx(Search, { className: "mr-2 h-4 w-4 shrink-0 opacity-50" }),
14968
14968
  /* @__PURE__ */ jsxRuntimeExports.jsx(
14969
14969
  _e$4.Input,
@@ -45935,53 +45935,53 @@ async function loadLanguage(lang) {
45935
45935
  try {
45936
45936
  switch (lang) {
45937
45937
  case "javascript":
45938
- return import("./index-BJCGggpH.js").then((m2) => m2.javascript());
45938
+ return import("./index-BeVYh61F.js").then((m2) => m2.javascript());
45939
45939
  case "jsx":
45940
- return import("./index-BJCGggpH.js").then((m2) => m2.javascript({ jsx: true }));
45940
+ return import("./index-BeVYh61F.js").then((m2) => m2.javascript({ jsx: true }));
45941
45941
  case "typescript":
45942
- return import("./index-BJCGggpH.js").then(
45942
+ return import("./index-BeVYh61F.js").then(
45943
45943
  (m2) => m2.javascript({ typescript: true })
45944
45944
  );
45945
45945
  case "tsx":
45946
- return import("./index-BJCGggpH.js").then(
45946
+ return import("./index-BeVYh61F.js").then(
45947
45947
  (m2) => m2.javascript({ jsx: true, typescript: true })
45948
45948
  );
45949
45949
  case "python":
45950
- return import("./index-BFGzZbup.js").then((m2) => m2.python());
45950
+ return import("./index-CIQ2H-15.js").then((m2) => m2.python());
45951
45951
  case "html":
45952
- return import("./index-CGahi9V_.js").then((m2) => m2.html());
45952
+ return import("./index-BstlKcBR.js").then((m2) => m2.html());
45953
45953
  case "css":
45954
- return import("./index-BqzKD5E_.js").then((m2) => m2.css());
45954
+ return import("./index-Dh1M5dNP.js").then((m2) => m2.css());
45955
45955
  case "scss":
45956
45956
  case "sass":
45957
- return import("./index-B0xGaLrl.js").then((m2) => m2.sass());
45957
+ return import("./index-C9azpIfZ.js").then((m2) => m2.sass());
45958
45958
  case "less":
45959
- return import("./index-DsUEML0Q.js").then((m2) => m2.less());
45959
+ return import("./index-BTtOxXlZ.js").then((m2) => m2.less());
45960
45960
  case "json":
45961
45961
  case "jsonc":
45962
- return import("./index-7EU1eTTa.js").then((m2) => m2.json());
45962
+ return import("./index-OaYzTlpS.js").then((m2) => m2.json());
45963
45963
  case "markdown":
45964
45964
  case "mdx":
45965
- return import("./index-B70OKozW.js").then((m2) => m2.markdown());
45965
+ return import("./index--KaT9H0k.js").then((m2) => m2.markdown());
45966
45966
  case "xml":
45967
- return import("./index-Cd5puaI6.js").then((m2) => m2.xml());
45967
+ return import("./index-CTx1RpR6.js").then((m2) => m2.xml());
45968
45968
  case "yaml":
45969
- return import("./index-BPhNydFp.js").then((m2) => m2.yaml());
45969
+ return import("./index-BJJ8j1rg.js").then((m2) => m2.yaml());
45970
45970
  case "sql":
45971
- return import("./index-Cwe7nbJw.js").then((m2) => m2.sql());
45971
+ return import("./index-P4B7a8It.js").then((m2) => m2.sql());
45972
45972
  case "rust":
45973
- return import("./index-BJtDnGxq.js").then((m2) => m2.rust());
45973
+ return import("./index-C2HXhI72.js").then((m2) => m2.rust());
45974
45974
  case "go":
45975
- return import("./index-C0OatepH.js").then((m2) => m2.go());
45975
+ return import("./index-CvolrjMO.js").then((m2) => m2.go());
45976
45976
  case "java":
45977
- return import("./index-1fKvU2GD.js").then((m2) => m2.java());
45977
+ return import("./index-0NB-RPox.js").then((m2) => m2.java());
45978
45978
  case "kotlin":
45979
- return import("./index-1fKvU2GD.js").then((m2) => m2.java());
45979
+ return import("./index-0NB-RPox.js").then((m2) => m2.java());
45980
45980
  case "c":
45981
45981
  case "cpp":
45982
- return import("./index-C9NLW19U.js").then((m2) => m2.cpp());
45982
+ return import("./index-B2cRwRII.js").then((m2) => m2.cpp());
45983
45983
  case "php":
45984
- return import("./index-y8Aubw3W.js").then((m2) => m2.php());
45984
+ return import("./index-a62bFj9q.js").then((m2) => m2.php());
45985
45985
  // Legacy modes via StreamLanguage
45986
45986
  case "bash":
45987
45987
  case "fish":
@@ -47040,44 +47040,6 @@ function CommandPaletteDialog({ open: open2, onOpenChange, commands }) {
47040
47040
  }
47041
47041
  ) });
47042
47042
  }
47043
- function useAppUpdate() {
47044
- const adapter2 = useAdapter();
47045
- const [state2, setState] = reactExports.useState({ status: "none" });
47046
- reactExports.useEffect(() => {
47047
- if (!adapter2.getUpdateStatus || !adapter2.subscribeUpdateStatus) return;
47048
- let cancelled2 = false;
47049
- adapter2.getUpdateStatus().then((pending2) => {
47050
- if (cancelled2) return;
47051
- if (pending2) {
47052
- setState({ status: "available", version: pending2.version });
47053
- }
47054
- }).catch(() => {
47055
- });
47056
- const unsubscribe = adapter2.subscribeUpdateStatus((pending2) => {
47057
- setState((prev2) => {
47058
- if (prev2.status === "installing") return prev2;
47059
- return pending2 ? { status: "available", version: pending2.version } : { status: "none" };
47060
- });
47061
- });
47062
- return () => {
47063
- cancelled2 = true;
47064
- unsubscribe();
47065
- };
47066
- }, [adapter2]);
47067
- const install = async () => {
47068
- if (!adapter2.installUpdate) return;
47069
- setState({ status: "installing" });
47070
- try {
47071
- await adapter2.installUpdate();
47072
- } catch (err) {
47073
- setState({
47074
- status: "error",
47075
- message: err instanceof Error ? err.message : String(err)
47076
- });
47077
- }
47078
- };
47079
- return { state: state2, install };
47080
- }
47081
47043
  function useCliSetup() {
47082
47044
  const adapter2 = useAdapter();
47083
47045
  const [state2, setState] = reactExports.useState({ status: "checking" });
@@ -51955,6 +51917,32 @@ function NewWorkspaceDialog({ projectName, open: open2, onOpenChange }) {
51955
51917
  ] })
51956
51918
  ] }) }) });
51957
51919
  }
51920
+ function ProjectAvatar({ avatar, fallback, className, testId }) {
51921
+ const [loaded, setLoaded] = reactExports.useState(null);
51922
+ if (!avatar) return /* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: fallback });
51923
+ const state2 = loaded?.src === avatar.src ? loaded.ok : void 0;
51924
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
51925
+ state2 !== true && fallback,
51926
+ state2 !== false && /* @__PURE__ */ jsxRuntimeExports.jsx(
51927
+ "img",
51928
+ {
51929
+ src: avatar.src,
51930
+ alt: avatar.label,
51931
+ hidden: state2 !== true,
51932
+ draggable: false,
51933
+ "data-testid": testId,
51934
+ ref: (el) => {
51935
+ if (el?.complete && state2 === void 0) {
51936
+ setLoaded({ src: avatar.src, ok: el.naturalWidth > 0 });
51937
+ }
51938
+ },
51939
+ className: `${className} shrink-0 rounded-sm object-cover`,
51940
+ onLoad: () => setLoaded({ src: avatar.src, ok: true }),
51941
+ onError: () => setLoaded({ src: avatar.src, ok: false })
51942
+ }
51943
+ )
51944
+ ] });
51945
+ }
51958
51946
  function PromoteToGitDialog({ open: open2, onOpenChange, onConfirm, projectName }) {
51959
51947
  return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { className: "sm:max-w-[425px]", onClick: (e3) => e3.stopPropagation(), children: [
51960
51948
  /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogHeader, { children: [
@@ -52413,16 +52401,30 @@ function SortableProject({
52413
52401
  // indicator's size-3 fallback would make plain headers
52414
52402
  // read as nested workspace cards (see #427 review).
52415
52403
  plainAgent && (plainAgent.status === "working" || plainAgent.status === "needs_attention") ? /* @__PURE__ */ jsxRuntimeExports.jsx(AgentStatusIndicator, { agent: plainAgent, isActive: plainIsActive }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Folder, { className: "size-4 shrink-0 text-muted-foreground" })
52416
- ) : collapsed ? /* @__PURE__ */ jsxRuntimeExports.jsx(
52417
- Folder,
52418
- {
52419
- className: `size-4 shrink-0 ${gitHeaderIsActive ? "text-primary" : "text-muted-foreground"}`
52420
- }
52421
- ) : /* @__PURE__ */ jsxRuntimeExports.jsx(
52422
- FolderOpen,
52423
- {
52424
- className: `size-4 shrink-0 ${gitHeaderIsActive ? "text-primary" : "text-muted-foreground"}`
52425
- }
52404
+ ) : (
52405
+ // Git project: the GitHub owner's avatar when `origin` is
52406
+ // on GitHub, else the open/closed folder.
52407
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
52408
+ ProjectAvatar,
52409
+ {
52410
+ avatar: project.avatar,
52411
+ className: "size-4",
52412
+ testId: `project-list__project-avatar--${project.name}`,
52413
+ fallback: collapsed ? /* @__PURE__ */ jsxRuntimeExports.jsx(
52414
+ Folder,
52415
+ {
52416
+ "data-testid": `project-list__project-folder--${project.name}`,
52417
+ className: `size-4 shrink-0 ${gitHeaderIsActive ? "text-primary" : "text-muted-foreground"}`
52418
+ }
52419
+ ) : /* @__PURE__ */ jsxRuntimeExports.jsx(
52420
+ FolderOpen,
52421
+ {
52422
+ "data-testid": `project-list__project-folder--${project.name}`,
52423
+ className: `size-4 shrink-0 ${gitHeaderIsActive ? "text-primary" : "text-muted-foreground"}`
52424
+ }
52425
+ )
52426
+ }
52427
+ )
52426
52428
  ),
52427
52429
  /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip$1, { children: [
52428
52430
  /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -52919,7 +52921,14 @@ function ProjectList({ labelFilter }) {
52919
52921
  ] }, groupKey);
52920
52922
  }) }),
52921
52923
  /* @__PURE__ */ jsxRuntimeExports.jsx(DragOverlay, { dropAnimation: null, children: activeDragId ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 px-1 py-1 bg-background rounded shadow-lg border", children: [
52922
- /* @__PURE__ */ jsxRuntimeExports.jsx(Folder, { className: "size-3.5 shrink-0 text-muted-foreground" }),
52924
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
52925
+ ProjectAvatar,
52926
+ {
52927
+ avatar: projects.find((p2) => p2.name === activeDragId)?.avatar,
52928
+ className: "size-3.5",
52929
+ fallback: /* @__PURE__ */ jsxRuntimeExports.jsx(Folder, { className: "size-3.5 shrink-0 text-muted-foreground" })
52930
+ }
52931
+ ),
52923
52932
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[13px] font-semibold text-foreground", children: activeDragId })
52924
52933
  ] }) : null })
52925
52934
  ]
@@ -53154,6 +53163,7 @@ function SettingsPage({ open: open2, onOpenChange }) {
53154
53163
  settings.enableFilePreviewTabs ?? true
53155
53164
  );
53156
53165
  const [selectedTheme, setSelectedTheme] = reactExports.useState(settings.theme ?? "system");
53166
+ const [translucentSidebar, setTranslucentSidebar] = reactExports.useState(settings.translucentSidebar ?? true);
53157
53167
  const [useWebGLTerminalRenderer, setUseWebGLTerminalRenderer] = reactExports.useState(
53158
53168
  settings.useWebGLTerminalRenderer ?? true
53159
53169
  );
@@ -53273,6 +53283,7 @@ function SettingsPage({ open: open2, onOpenChange }) {
53273
53283
  if (enableLSP !== (settings.enableLSP ?? false)) return true;
53274
53284
  if (enableFilePreviewTabs !== (settings.enableFilePreviewTabs ?? true)) return true;
53275
53285
  if (selectedTheme !== (settings.theme ?? "system")) return true;
53286
+ if (translucentSidebar !== (settings.translucentSidebar ?? true)) return true;
53276
53287
  if (useWebGLTerminalRenderer !== (settings.useWebGLTerminalRenderer ?? true)) return true;
53277
53288
  if (webBrowserCdpEnabled !== (settings.webBrowserCdpEnabled ?? false)) return true;
53278
53289
  if (usageRetentionDays !== (settings.usageRetentionDays?.toString() ?? "")) return true;
@@ -53290,6 +53301,7 @@ function SettingsPage({ open: open2, onOpenChange }) {
53290
53301
  enableLSP,
53291
53302
  enableFilePreviewTabs,
53292
53303
  selectedTheme,
53304
+ translucentSidebar,
53293
53305
  useWebGLTerminalRenderer,
53294
53306
  webBrowserCdpEnabled,
53295
53307
  usageRetentionDays,
@@ -53308,6 +53320,7 @@ function SettingsPage({ open: open2, onOpenChange }) {
53308
53320
  setEnableLSP(settings.enableLSP ?? false);
53309
53321
  setEnableFilePreviewTabs(settings.enableFilePreviewTabs ?? true);
53310
53322
  setSelectedTheme(settings.theme ?? "system");
53323
+ setTranslucentSidebar(settings.translucentSidebar ?? true);
53311
53324
  setUseWebGLTerminalRenderer(settings.useWebGLTerminalRenderer ?? true);
53312
53325
  setWebBrowserCdpEnabled(settings.webBrowserCdpEnabled ?? false);
53313
53326
  setUsageRetentionDays(settings.usageRetentionDays?.toString() ?? "");
@@ -53323,6 +53336,7 @@ function SettingsPage({ open: open2, onOpenChange }) {
53323
53336
  settings.enableLSP,
53324
53337
  settings.enableFilePreviewTabs,
53325
53338
  settings.theme,
53339
+ settings.translucentSidebar,
53326
53340
  settings.useWebGLTerminalRenderer,
53327
53341
  settings.webBrowserCdpEnabled,
53328
53342
  settings.usageRetentionDays,
@@ -53368,6 +53382,7 @@ function SettingsPage({ open: open2, onOpenChange }) {
53368
53382
  enableLSP,
53369
53383
  enableFilePreviewTabs,
53370
53384
  theme: selectedTheme,
53385
+ translucentSidebar,
53371
53386
  useWebGLTerminalRenderer,
53372
53387
  webBrowserCdpEnabled,
53373
53388
  usageRetentionDays: parsedUsageRetentionDays,
@@ -53386,29 +53401,47 @@ function SettingsPage({ open: open2, onOpenChange }) {
53386
53401
  children: [
53387
53402
  /* @__PURE__ */ jsxRuntimeExports.jsx(DialogHeader, { className: "px-6 pt-6 pb-4 shrink-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: "Settings" }) }),
53388
53403
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 min-h-0 overflow-y-auto", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-6 px-6 pb-6", children: [
53389
- /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsSection, { title: "Appearance", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
53390
- SettingsRow,
53391
- {
53392
- variant: "responsive",
53393
- label: "Theme",
53394
- description: "Choose between system default, light, and dark mode.",
53395
- children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
53396
- Select,
53397
- {
53398
- value: selectedTheme,
53399
- onValueChange: (v2) => setSelectedTheme(v2),
53400
- children: [
53401
- /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-8 w-full text-sm sm:w-32", "aria-label": "Theme", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {}) }),
53402
- /* @__PURE__ */ jsxRuntimeExports.jsxs(SelectContent, { children: [
53403
- /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: "system", children: "System" }),
53404
- /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: "light", children: "Light" }),
53405
- /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: "dark", children: "Dark" })
53406
- ] })
53407
- ]
53408
- }
53409
- )
53410
- }
53411
- ) }),
53404
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(SettingsSection, { title: "Appearance", children: [
53405
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
53406
+ SettingsRow,
53407
+ {
53408
+ variant: "responsive",
53409
+ label: "Theme",
53410
+ description: "Choose between system default, light, and dark mode.",
53411
+ children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
53412
+ Select,
53413
+ {
53414
+ value: selectedTheme,
53415
+ onValueChange: (v2) => setSelectedTheme(v2),
53416
+ children: [
53417
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-8 w-full text-sm sm:w-32", "aria-label": "Theme", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {}) }),
53418
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(SelectContent, { children: [
53419
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: "system", children: "System" }),
53420
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: "light", children: "Light" }),
53421
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: "dark", children: "Dark" })
53422
+ ] })
53423
+ ]
53424
+ }
53425
+ )
53426
+ }
53427
+ ),
53428
+ capabilities2.translucentSidebar && /* @__PURE__ */ jsxRuntimeExports.jsx(
53429
+ SettingsRow,
53430
+ {
53431
+ htmlFor: "translucent-sidebar",
53432
+ label: "Translucent sidebar",
53433
+ description: "Show the desktop through the project list, blurred and tinted.",
53434
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
53435
+ Switch,
53436
+ {
53437
+ id: "translucent-sidebar",
53438
+ checked: translucentSidebar,
53439
+ onCheckedChange: setTranslucentSidebar
53440
+ }
53441
+ )
53442
+ }
53443
+ )
53444
+ ] }),
53412
53445
  /* @__PURE__ */ jsxRuntimeExports.jsxs(SettingsSection, { title: "General", children: [
53413
53446
  /* @__PURE__ */ jsxRuntimeExports.jsx(
53414
53447
  SettingsRow,
@@ -54010,7 +54043,6 @@ function DashboardShell({
54010
54043
  const activeWorkspaceId = useDashboardStore((s2) => s2.activeWorkspaceId);
54011
54044
  const { state: hooksState, install: installHooks } = useHooksSetup();
54012
54045
  const { state: cliState, install: installCli } = useCliSetup();
54013
- const { state: updateState, install: installUpdate } = useAppUpdate();
54014
54046
  const [appTitle, setAppTitle] = reactExports.useState("Band");
54015
54047
  reactExports.useEffect(() => {
54016
54048
  if (!isDesktop$1) return;
@@ -54139,8 +54171,11 @@ function DashboardShell({
54139
54171
  "w-full overflow-hidden flex flex-col text-foreground p-0",
54140
54172
  // Embedded as the project-list sidebar (hideTitleBar): paint the
54141
54173
  // `--sidebar` surface so the list reads as a panel distinct from the
54142
- // workspace layout. Standalone (mobile / narrow web): plain background.
54143
- hideTitleBar ? "h-full bg-sidebar" : "bg-background",
54174
+ // workspace layout. Under the translucent sidebar (macOS desktop) the
54175
+ // AppShell column already paints the tint, so stay transparent rather
54176
+ // than stack a second layer. Standalone (mobile / narrow web): plain
54177
+ // background.
54178
+ hideTitleBar ? "h-full bg-sidebar translucent-sidebar:bg-transparent" : "bg-background",
54144
54179
  !isDesktop$1 && "pt-[env(safe-area-inset-top)]",
54145
54180
  // Full screen the action bar keeps a 16px gap above the bottom edge,
54146
54181
  // widened to the home-indicator inset when there is one. In the
@@ -54279,18 +54314,6 @@ function DashboardShell({
54279
54314
  ] }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ProjectList, { labelFilter }) })
54280
54315
  }
54281
54316
  ),
54282
- updateState.status === "available" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mx-4 mb-2 px-4 py-2 bg-blue-500/10 border border-blue-500/30 rounded-lg text-sm flex items-center justify-between gap-2", children: [
54283
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-blue-700 dark:text-blue-200", children: `Band v${updateState.version} is available` }),
54284
- /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "outline", size: "sm", className: "shrink-0 text-xs", onClick: installUpdate, children: "Install" })
54285
- ] }),
54286
- updateState.status === "installing" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mx-4 mb-2 px-4 py-2 bg-blue-500/10 border border-blue-500/30 rounded-lg text-sm flex items-center justify-between gap-2", children: [
54287
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-blue-700 dark:text-blue-200", children: "Installing update…" }),
54288
- /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "outline", size: "sm", className: "shrink-0 text-xs", disabled: true, children: "Install" })
54289
- ] }),
54290
- updateState.status === "error" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mx-4 mb-2 px-4 py-2 bg-destructive/10 border border-destructive/30 rounded-lg text-sm text-destructive flex items-center justify-between gap-2", children: [
54291
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: `Update failed: ${updateState.message}` }),
54292
- /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "outline", size: "sm", className: "shrink-0 text-xs", onClick: installUpdate, children: "Retry" })
54293
- ] }),
54294
54317
  (cliState.status === "manual" || cliState.status === "conflict") && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mx-4 mb-2 px-4 py-2 bg-blue-500/10 border border-blue-500/30 rounded-lg text-sm flex items-center justify-between gap-2", children: [
54295
54318
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-blue-700 dark:text-blue-200", children: cliState.status === "conflict" ? "A different `band` binary exists — replace it to use the bundled CLI" : `Install band CLI${cliState.status === "manual" && cliState.reason ? ` — ${cliState.reason}` : ""}` }),
54296
54319
  /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "outline", size: "sm", className: "shrink-0 text-xs", onClick: installCli, children: "Install" })
@@ -58017,7 +58040,7 @@ function FileViewer({
58017
58040
  lineEnd,
58018
58041
  column: column2,
58019
58042
  onEditorView,
58020
- toolbar,
58043
+ overlay,
58021
58044
  renderMarkdown,
58022
58045
  editable: editable2,
58023
58046
  onGoBack,
@@ -58495,8 +58518,8 @@ function FileViewer({
58495
58518
  ] }),
58496
58519
  data && !hidePathLabel && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "shrink-0 text-xs text-muted-foreground", children: formatSize(data.size) })
58497
58520
  ] }),
58498
- toolbar,
58499
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-h-0 min-w-0 flex-1 overflow-hidden", children: [
58521
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative min-h-0 min-w-0 flex-1 overflow-hidden", children: [
58522
+ overlay,
58500
58523
  loading && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex h-32 items-center justify-center text-sm text-muted-foreground", children: "Loading..." }),
58501
58524
  error && /* @__PURE__ */ jsxRuntimeExports.jsx(
58502
58525
  "div",
@@ -58901,7 +58924,7 @@ function QuickOpenDialog({
58901
58924
  onValueChange: setQuery
58902
58925
  }
58903
58926
  ),
58904
- parsedQuery.line != null && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border-b px-3 py-1.5 text-xs text-muted-foreground", children: [
58927
+ parsedQuery.line != null && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border-b border-border px-3 py-1.5 text-xs text-muted-foreground", children: [
58905
58928
  "Go to line ",
58906
58929
  parsedQuery.line,
58907
58930
  parsedQuery.lineEnd != null && `-${parsedQuery.lineEnd}`,
@@ -58989,6 +59012,7 @@ const SearchBar = reactExports.forwardRef(function SearchBar2({
58989
59012
  onPrevious,
58990
59013
  onClose,
58991
59014
  visibleOptions = DEFAULT_VISIBLE_OPTIONS,
59015
+ variant = "bar",
58992
59016
  className
58993
59017
  }, ref) {
58994
59018
  const showCase = visibleOptions.includes("caseSensitive");
@@ -59008,21 +59032,30 @@ const SearchBar = reactExports.forwardRef(function SearchBar2({
59008
59032
  const toggleRegex = reactExports.useCallback(() => {
59009
59033
  onOptionsChange({ ...options, regex: !options.regex });
59010
59034
  }, [options, onOptionsChange]);
59035
+ const floating = variant === "floating";
59036
+ const hasMatches = !!matchInfo && matchInfo.total > 0;
59037
+ const noResults = !!query && !!matchInfo && !hasMatches;
59011
59038
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
59012
59039
  "div",
59013
59040
  {
59041
+ "data-testid": floating ? "find-widget" : void 0,
59014
59042
  className: cn$2(
59015
- "flex shrink-0 items-center gap-1.5 border-b border-border bg-muted/30 px-3 py-1.5",
59043
+ floating ? "absolute top-1.5 right-4 z-20 flex w-80 max-w-[calc(100%-1.5rem)] items-center gap-0.5 rounded-md border border-border bg-popover py-1 pr-1 pl-2 text-popover-foreground shadow-md" : "flex shrink-0 items-center gap-1.5 border-b border-border bg-muted/30 px-3 py-1.5",
59016
59044
  className
59017
59045
  ),
59018
59046
  children: [
59019
- /* @__PURE__ */ jsxRuntimeExports.jsx(Search, { className: "size-3.5 shrink-0 text-muted-foreground" }),
59047
+ !floating && /* @__PURE__ */ jsxRuntimeExports.jsx(Search, { className: "size-3.5 shrink-0 text-muted-foreground" }),
59020
59048
  /* @__PURE__ */ jsxRuntimeExports.jsx(
59021
59049
  "input",
59022
59050
  {
59023
59051
  ref: inputRef,
59024
- className: "min-w-0 flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground",
59052
+ className: cn$2(
59053
+ "min-w-0 flex-1 bg-transparent outline-none placeholder:text-muted-foreground",
59054
+ floating ? "text-[13px]" : "text-sm"
59055
+ ),
59025
59056
  placeholder,
59057
+ "aria-label": placeholder,
59058
+ "aria-invalid": noResults || void 0,
59026
59059
  value: query,
59027
59060
  onChange: (e3) => onQueryChange(e3.target.value),
59028
59061
  onKeyDown: (e3) => {
@@ -59041,13 +59074,27 @@ const SearchBar = reactExports.forwardRef(function SearchBar2({
59041
59074
  showCase && /* @__PURE__ */ jsxRuntimeExports.jsx(ToggleButton, { active: options.caseSensitive, onClick: toggleCase, title: "Match Case", children: /* @__PURE__ */ jsxRuntimeExports.jsx(CaseSensitive, { className: "size-4" }) }),
59042
59075
  showWholeWord && /* @__PURE__ */ jsxRuntimeExports.jsx(ToggleButton, { active: options.wholeWord, onClick: toggleWholeWord, title: "Match Whole Word", children: /* @__PURE__ */ jsxRuntimeExports.jsx(WholeWord, { className: "size-4" }) }),
59043
59076
  showRegex && /* @__PURE__ */ jsxRuntimeExports.jsx(ToggleButton, { active: options.regex, onClick: toggleRegex, title: "Use Regular Expression", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Regex, { className: "size-4" }) }),
59044
- matchInfo && query && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "shrink-0 text-xs text-muted-foreground tabular-nums", children: matchInfo.total > 0 ? `${matchInfo.current} of ${matchInfo.total}` : "No results" }),
59077
+ floating ? (
59078
+ // Always shown, like VS Code: `0/0` before a query, `3/12` while
59079
+ // matching, "No results" when a query matched nothing.
59080
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
59081
+ "span",
59082
+ {
59083
+ "data-testid": "find-widget__count",
59084
+ className: cn$2(
59085
+ "shrink-0 px-1 text-xs tabular-nums",
59086
+ noResults ? "text-destructive" : "text-muted-foreground"
59087
+ ),
59088
+ children: noResults ? "No results" : `${hasMatches ? matchInfo.current : 0}/${hasMatches ? matchInfo.total : 0}`
59089
+ }
59090
+ )
59091
+ ) : matchInfo && query && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "shrink-0 text-xs text-muted-foreground tabular-nums", children: matchInfo.total > 0 ? `${matchInfo.current} of ${matchInfo.total}` : "No results" }),
59045
59092
  onPrevious && /* @__PURE__ */ jsxRuntimeExports.jsx(
59046
59093
  "button",
59047
59094
  {
59048
59095
  type: "button",
59049
59096
  onClick: onPrevious,
59050
- disabled: !matchInfo || matchInfo.total === 0,
59097
+ disabled: !hasMatches,
59051
59098
  className: "inline-flex size-6 items-center justify-center rounded text-muted-foreground hover:text-foreground disabled:opacity-30",
59052
59099
  title: "Previous match (Shift+Enter)",
59053
59100
  children: /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronUp, { className: "size-3.5" })
@@ -59058,12 +59105,13 @@ const SearchBar = reactExports.forwardRef(function SearchBar2({
59058
59105
  {
59059
59106
  type: "button",
59060
59107
  onClick: onNext,
59061
- disabled: !matchInfo || matchInfo.total === 0,
59108
+ disabled: !hasMatches,
59062
59109
  className: "inline-flex size-6 items-center justify-center rounded text-muted-foreground hover:text-foreground disabled:opacity-30",
59063
59110
  title: "Next match (Enter)",
59064
59111
  children: /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "size-3.5" })
59065
59112
  }
59066
59113
  ),
59114
+ floating && onClose && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { "aria-hidden": true, className: "mx-0.5 h-4 w-px shrink-0 bg-border" }),
59067
59115
  onClose && /* @__PURE__ */ jsxRuntimeExports.jsx(
59068
59116
  "button",
59069
59117
  {
@@ -59217,7 +59265,7 @@ function SearchFilesDialog({
59217
59265
  );
59218
59266
  })
59219
59267
  ] }),
59220
- totalMatches > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border-t px-3 py-1.5 text-xs text-muted-foreground", children: [
59268
+ totalMatches > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border-t border-border px-3 py-1.5 text-xs text-muted-foreground", children: [
59221
59269
  totalMatches,
59222
59270
  " result",
59223
59271
  totalMatches !== 1 ? "s" : "",
@@ -66367,33 +66415,33 @@ class DesktopDashboardAdapter extends WebDashboardAdapter {
66367
66415
  throw err;
66368
66416
  }
66369
66417
  }
66370
- // ---- Background app-update banner (see updater.ts) -----------------------
66371
- // The web adapter intentionally omits these so a plain browser tab never
66372
- // sees the banner (the hook short-circuits to "none" when the adapter
66373
- // method is undefined). Only the desktop shell can drive electron-updater.
66374
- /** Read the current pending update, if any. Used by the hook on mount to
66375
- * catch the race where the renderer mounts after the startup check
66376
- * already populated main-process state. */
66418
+ // ---- App-update toast (see apps/desktop/src/main/updater.ts) -----------
66419
+ // The web adapter omits these, so a plain browser tab never shows the
66420
+ // toast. Only the desktop shell can drive electron-updater.
66421
+ /** The current status. Read on mount, since the startup check may have
66422
+ * finished before the renderer subscribed. */
66377
66423
  async getUpdateStatus() {
66378
66424
  return desktopInvoke("updater_status");
66379
66425
  }
66380
- /** Kick off the download + install. On success the OS quits the process,
66381
- * so this promise typically never resolves in production. */
66382
- async installUpdate() {
66383
- await desktopInvoke("updater_install");
66384
- }
66385
- /** Subscribe to `updater-status-changed` events emitted by the main
66386
- * process. Returns the unlisten. Throws if called outside the shell —
66387
- * callers should gate on `getUpdateStatus` being defined first. */
66388
66426
  subscribeUpdateStatus(cb) {
66389
66427
  const bridge = electronBridge$1();
66390
66428
  if (!bridge) {
66391
66429
  throw new Error("subscribeUpdateStatus called outside the desktop shell");
66392
66430
  }
66393
- return bridge.on(
66394
- "updater-status-changed",
66395
- (payload) => cb(payload)
66396
- );
66431
+ return bridge.on("updater-status-changed", (payload) => cb(payload));
66432
+ }
66433
+ async checkForUpdates() {
66434
+ await desktopInvoke("updater_check");
66435
+ }
66436
+ async downloadUpdate() {
66437
+ await desktopInvoke("updater_download");
66438
+ }
66439
+ /** Quits the app to install the downloaded update. */
66440
+ async restartToUpdate() {
66441
+ await desktopInvoke("updater_restart");
66442
+ }
66443
+ async dismissUpdate() {
66444
+ await desktopInvoke("updater_dismiss");
66397
66445
  }
66398
66446
  }
66399
66447
  class NativeShellCapabilities {
@@ -66402,6 +66450,11 @@ class NativeShellCapabilities {
66402
66450
  get copyPath() {
66403
66451
  return isDesktopShell();
66404
66452
  }
66453
+ // The desktop window only gets its vibrancy layer on macOS (see
66454
+ // `apps/desktop/src/main/window.ts`).
66455
+ get translucentSidebar() {
66456
+ return isDesktopShell() && /Mac/.test(navigator.userAgent);
66457
+ }
66405
66458
  getWorkspaceHref(workspaceId) {
66406
66459
  return this.web.getWorkspaceHref(workspaceId);
66407
66460
  }
@@ -66457,6 +66510,48 @@ class NativeShellCapabilities {
66457
66510
  await desktopInvoke("open_external", { url });
66458
66511
  }
66459
66512
  }
66513
+ let domOverlayCount = 0;
66514
+ let manualHoldCount = 0;
66515
+ const listeners$3 = /* @__PURE__ */ new Set();
66516
+ let lastEmitted = false;
66517
+ function isFrozen$3() {
66518
+ return domOverlayCount + manualHoldCount > 0;
66519
+ }
66520
+ function emitIfChanged() {
66521
+ const next2 = isFrozen$3();
66522
+ if (next2 === lastEmitted) return;
66523
+ lastEmitted = next2;
66524
+ for (const l4 of listeners$3) l4();
66525
+ }
66526
+ function subscribe$2(l4) {
66527
+ listeners$3.add(l4);
66528
+ return () => {
66529
+ listeners$3.delete(l4);
66530
+ };
66531
+ }
66532
+ function getSnapshot$2() {
66533
+ return lastEmitted;
66534
+ }
66535
+ function useBrowserPaneFrozen() {
66536
+ return reactExports.useSyncExternalStore(subscribe$2, getSnapshot$2, getSnapshot$2);
66537
+ }
66538
+ function acquireFreezeHold() {
66539
+ manualHoldCount += 1;
66540
+ emitIfChanged();
66541
+ let released = false;
66542
+ return () => {
66543
+ if (released) return;
66544
+ released = true;
66545
+ manualHoldCount = Math.max(0, manualHoldCount - 1);
66546
+ emitIfChanged();
66547
+ };
66548
+ }
66549
+ function useFreezeWhile(open2) {
66550
+ reactExports.useEffect(() => {
66551
+ if (!open2) return;
66552
+ return acquireFreezeHold();
66553
+ }, [open2]);
66554
+ }
66460
66555
  const isDesktop = typeof window !== "undefined" && "__BAND_DESKTOP__" in window;
66461
66556
  function getElectronBridge() {
66462
66557
  if (!isDesktop) return null;
@@ -66480,6 +66575,227 @@ async function listen(event, cb) {
66480
66575
  }
66481
66576
  throw new Error(`listen('${event}') called outside the desktop shell`);
66482
66577
  }
66578
+ function openExternalUrl(url) {
66579
+ if (isDesktop) {
66580
+ invoke("open_external", { url }).catch(() => {
66581
+ window.open(url, "_blank", "noopener");
66582
+ });
66583
+ return;
66584
+ }
66585
+ window.open(url, "_blank", "noopener");
66586
+ }
66587
+ const UP_TO_DATE_DISMISS_MS = 4e3;
66588
+ function useAppUpdate() {
66589
+ const adapter2 = useAdapter();
66590
+ const [status, setStatus] = reactExports.useState({ state: "idle" });
66591
+ reactExports.useEffect(() => {
66592
+ if (!adapter2.getUpdateStatus || !adapter2.subscribeUpdateStatus) return;
66593
+ let cancelled2 = false;
66594
+ let received = false;
66595
+ const unsubscribe = adapter2.subscribeUpdateStatus((next2) => {
66596
+ received = true;
66597
+ setStatus(next2);
66598
+ });
66599
+ adapter2.getUpdateStatus().then((initial) => {
66600
+ if (!cancelled2 && !received) setStatus(initial);
66601
+ }).catch(() => {
66602
+ });
66603
+ return () => {
66604
+ cancelled2 = true;
66605
+ unsubscribe();
66606
+ };
66607
+ }, [adapter2]);
66608
+ const dismiss = reactExports.useCallback(() => {
66609
+ setStatus({ state: "idle" });
66610
+ adapter2.dismissUpdate?.().catch(ignore$1);
66611
+ }, [adapter2]);
66612
+ reactExports.useEffect(() => {
66613
+ if (status.state !== "up-to-date") return;
66614
+ const timer2 = setTimeout(dismiss, UP_TO_DATE_DISMISS_MS);
66615
+ return () => clearTimeout(timer2);
66616
+ }, [status, dismiss]);
66617
+ const retry = reactExports.useCallback(() => {
66618
+ if (status.state !== "error") return;
66619
+ if (status.phase === "download") adapter2.downloadUpdate?.().catch(ignore$1);
66620
+ else adapter2.checkForUpdates?.().catch(ignore$1);
66621
+ }, [adapter2, status]);
66622
+ return {
66623
+ status: isVisible$1(status) ? status : null,
66624
+ download: reactExports.useCallback(() => adapter2.downloadUpdate?.().catch(ignore$1), [adapter2]),
66625
+ restart: reactExports.useCallback(() => adapter2.restartToUpdate?.().catch(ignore$1), [adapter2]),
66626
+ retry,
66627
+ dismiss
66628
+ };
66629
+ }
66630
+ function ignore$1() {
66631
+ }
66632
+ function isVisible$1(status) {
66633
+ switch (status.state) {
66634
+ case "idle":
66635
+ return false;
66636
+ case "checking":
66637
+ case "up-to-date":
66638
+ case "error":
66639
+ return status.userInitiated;
66640
+ case "available":
66641
+ case "downloading":
66642
+ case "downloaded":
66643
+ return true;
66644
+ }
66645
+ }
66646
+ function UpdateToast() {
66647
+ const { status, download, restart, retry, dismiss } = useAppUpdate();
66648
+ const state2 = status?.state;
66649
+ useFreezeWhile(
66650
+ state2 === "checking" || state2 === "up-to-date" || state2 === "error" || state2 === "downloading"
66651
+ );
66652
+ if (!status) return null;
66653
+ let body2;
66654
+ let closable = true;
66655
+ switch (status.state) {
66656
+ case "checking":
66657
+ closable = false;
66658
+ body2 = /* @__PURE__ */ jsxRuntimeExports.jsx(ToastHeader, { icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-4" }), title: "Checking for updates…" });
66659
+ break;
66660
+ case "up-to-date":
66661
+ body2 = /* @__PURE__ */ jsxRuntimeExports.jsx(
66662
+ ToastHeader,
66663
+ {
66664
+ icon: /* @__PURE__ */ jsxRuntimeExports.jsx(CircleCheck, { className: "size-4 text-emerald-500" }),
66665
+ title: "You're on the latest version",
66666
+ detail: `Band v${status.currentVersion}`
66667
+ }
66668
+ );
66669
+ break;
66670
+ case "available":
66671
+ body2 = /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
66672
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
66673
+ ToastHeader,
66674
+ {
66675
+ icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Download, { className: "size-4 text-blue-500" }),
66676
+ title: `Band v${status.version} is available`,
66677
+ detail: `You have v${status.currentVersion}.`
66678
+ }
66679
+ ),
66680
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ReleaseInfo, { release: status }),
66681
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(ToastActions, { children: [
66682
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "ghost", size: "xs", onClick: dismiss, children: "Later" }),
66683
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { size: "xs", onClick: download, children: "Update" })
66684
+ ] })
66685
+ ] });
66686
+ break;
66687
+ case "downloading":
66688
+ closable = false;
66689
+ body2 = /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
66690
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
66691
+ ToastHeader,
66692
+ {
66693
+ icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, { className: "size-4" }),
66694
+ title: `Downloading Band v${status.version}…`,
66695
+ detail: `${status.percent}%`
66696
+ }
66697
+ ),
66698
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
66699
+ "div",
66700
+ {
66701
+ role: "progressbar",
66702
+ "aria-label": "Update download",
66703
+ "aria-valuemin": 0,
66704
+ "aria-valuemax": 100,
66705
+ "aria-valuenow": status.percent,
66706
+ className: "mt-2.5 h-1.5 overflow-hidden rounded-full bg-muted",
66707
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
66708
+ "div",
66709
+ {
66710
+ className: "h-full rounded-full bg-primary transition-[width] duration-300 ease-out",
66711
+ style: { width: `${status.percent}%` }
66712
+ }
66713
+ )
66714
+ }
66715
+ )
66716
+ ] });
66717
+ break;
66718
+ case "downloaded":
66719
+ body2 = /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
66720
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
66721
+ ToastHeader,
66722
+ {
66723
+ icon: /* @__PURE__ */ jsxRuntimeExports.jsx(CircleCheck, { className: "size-4 text-emerald-500" }),
66724
+ title: `Band v${status.version} is ready`,
66725
+ detail: "Restart Band to finish updating. It also installs when you quit."
66726
+ }
66727
+ ),
66728
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(ToastActions, { children: [
66729
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "ghost", size: "xs", onClick: dismiss, children: "Later" }),
66730
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Button, { size: "xs", onClick: restart, children: [
66731
+ /* @__PURE__ */ jsxRuntimeExports.jsx(RotateCw, {}),
66732
+ "Restart to update"
66733
+ ] })
66734
+ ] })
66735
+ ] });
66736
+ break;
66737
+ case "error":
66738
+ body2 = /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
66739
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
66740
+ ToastHeader,
66741
+ {
66742
+ icon: /* @__PURE__ */ jsxRuntimeExports.jsx(CircleAlert, { className: "size-4 text-destructive" }),
66743
+ title: status.phase === "download" ? "Couldn't download the update" : "Couldn't check for updates",
66744
+ detail: status.message
66745
+ }
66746
+ ),
66747
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ToastActions, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "outline", size: "xs", onClick: retry, children: "Retry" }) })
66748
+ ] });
66749
+ break;
66750
+ }
66751
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
66752
+ "output",
66753
+ {
66754
+ "aria-live": "polite",
66755
+ "data-testid": "update-toast",
66756
+ className: "fixed right-4 bottom-4 left-4 z-50 block rounded-lg border bg-popover p-3 text-sm text-popover-foreground shadow-lg animate-in fade-in-0 slide-in-from-bottom-2 duration-200 sm:left-auto sm:w-80",
66757
+ children: [
66758
+ closable && /* @__PURE__ */ jsxRuntimeExports.jsx(
66759
+ "button",
66760
+ {
66761
+ type: "button",
66762
+ "aria-label": "Close",
66763
+ onClick: dismiss,
66764
+ className: "absolute top-2 right-2 rounded-sm p-1 text-muted-foreground hover:bg-accent hover:text-accent-foreground",
66765
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(X$7, { className: "size-3.5" })
66766
+ }
66767
+ ),
66768
+ body2
66769
+ ]
66770
+ }
66771
+ );
66772
+ }
66773
+ function ToastHeader({ icon: icon2, title, detail }) {
66774
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex gap-2.5 pr-6", children: [
66775
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "mt-0.5 shrink-0", children: icon2 }),
66776
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0", children: [
66777
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-medium", children: title }),
66778
+ detail && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-0.5 line-clamp-3 break-words text-xs text-muted-foreground", children: detail })
66779
+ ] })
66780
+ ] });
66781
+ }
66782
+ function ReleaseInfo({ release }) {
66783
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-2 pl-6.5", children: [
66784
+ release.releaseNotes && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "max-h-28 overflow-y-auto whitespace-pre-line text-xs text-muted-foreground", children: release.releaseNotes }),
66785
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
66786
+ "button",
66787
+ {
66788
+ type: "button",
66789
+ onClick: () => openExternalUrl(release.releaseUrl),
66790
+ className: "mt-1.5 text-xs text-primary underline-offset-4 hover:underline",
66791
+ children: "Release notes on GitHub"
66792
+ }
66793
+ )
66794
+ ] });
66795
+ }
66796
+ function ToastActions({ children: children2 }) {
66797
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-3 flex justify-end gap-2", children: children2 });
66798
+ }
66483
66799
  const wsClient = createWSClient({
66484
66800
  url: () => {
66485
66801
  const proto2 = location.protocol === "https:" ? "wss:" : "ws:";
@@ -66819,7 +67135,7 @@ function SidebarTitleBar() {
66819
67135
  "div",
66820
67136
  {
66821
67137
  "data-testid": "desktop-title-bar__sidebar-surface",
66822
- className: "h-[38px] shrink-0 flex items-center border-b border-border bg-sidebar",
67138
+ className: "h-[38px] shrink-0 flex items-center border-b border-border",
66823
67139
  style: DRAG_STYLE
66824
67140
  }
66825
67141
  );
@@ -66918,7 +67234,7 @@ function parseWorkspaceFromPath(pathname) {
66918
67234
  return match ? decodeURIComponent(match[1]) : null;
66919
67235
  }
66920
67236
  const states = /* @__PURE__ */ new Map();
66921
- const listeners$3 = /* @__PURE__ */ new Map();
67237
+ const listeners$2 = /* @__PURE__ */ new Map();
66922
67238
  const EMPTY_STATE = Object.freeze({ openFilePath: null });
66923
67239
  function getPerWorkspaceState(workspaceId) {
66924
67240
  return states.get(workspaceId) ?? EMPTY_STATE;
@@ -66928,19 +67244,19 @@ function setPerWorkspaceState(workspaceId, patch2) {
66928
67244
  const next2 = { ...prev2, ...patch2 };
66929
67245
  if (prev2.currentFile === next2.currentFile && prev2.openFilePath === next2.openFilePath) return;
66930
67246
  states.set(workspaceId, next2);
66931
- const set2 = listeners$3.get(workspaceId);
67247
+ const set2 = listeners$2.get(workspaceId);
66932
67248
  if (set2) for (const cb of set2) cb();
66933
67249
  }
66934
67250
  function subscribePerWorkspaceState(workspaceId, cb) {
66935
- let set2 = listeners$3.get(workspaceId);
67251
+ let set2 = listeners$2.get(workspaceId);
66936
67252
  if (!set2) {
66937
67253
  set2 = /* @__PURE__ */ new Set();
66938
- listeners$3.set(workspaceId, set2);
67254
+ listeners$2.set(workspaceId, set2);
66939
67255
  }
66940
67256
  set2.add(cb);
66941
67257
  return () => {
66942
67258
  set2?.delete(cb);
66943
- if (set2 && set2.size === 0) listeners$3.delete(workspaceId);
67259
+ if (set2 && set2.size === 0) listeners$2.delete(workspaceId);
66944
67260
  };
66945
67261
  }
66946
67262
  function clearPerWorkspaceState(workspaceId) {
@@ -82269,15 +82585,6 @@ function pathInside(parent, child) {
82269
82585
  if (!child.startsWith(prefix)) return null;
82270
82586
  return child.slice(prefix.length);
82271
82587
  }
82272
- function openExternalUrl(url) {
82273
- if (isDesktop) {
82274
- invoke("open_external", { url }).catch(() => {
82275
- window.open(url, "_blank", "noopener");
82276
- });
82277
- return;
82278
- }
82279
- window.open(url, "_blank", "noopener");
82280
- }
82281
82588
  const KNOWN_EXTENSIONS = /* @__PURE__ */ new Set([
82282
82589
  // Code
82283
82590
  "ts",
@@ -83727,48 +84034,6 @@ function reconcileTerminalWorkspaces(validWorkspaceIds, activeWorkspaceId) {
83727
84034
  function hasTerminal(terminalId) {
83728
84035
  return getCache().has(terminalId);
83729
84036
  }
83730
- let domOverlayCount = 0;
83731
- let manualHoldCount = 0;
83732
- const listeners$2 = /* @__PURE__ */ new Set();
83733
- let lastEmitted = false;
83734
- function isFrozen$3() {
83735
- return domOverlayCount + manualHoldCount > 0;
83736
- }
83737
- function emitIfChanged() {
83738
- const next2 = isFrozen$3();
83739
- if (next2 === lastEmitted) return;
83740
- lastEmitted = next2;
83741
- for (const l4 of listeners$2) l4();
83742
- }
83743
- function subscribe$2(l4) {
83744
- listeners$2.add(l4);
83745
- return () => {
83746
- listeners$2.delete(l4);
83747
- };
83748
- }
83749
- function getSnapshot$2() {
83750
- return lastEmitted;
83751
- }
83752
- function useBrowserPaneFrozen() {
83753
- return reactExports.useSyncExternalStore(subscribe$2, getSnapshot$2, getSnapshot$2);
83754
- }
83755
- function acquireFreezeHold() {
83756
- manualHoldCount += 1;
83757
- emitIfChanged();
83758
- let released = false;
83759
- return () => {
83760
- if (released) return;
83761
- released = true;
83762
- manualHoldCount = Math.max(0, manualHoldCount - 1);
83763
- emitIfChanged();
83764
- };
83765
- }
83766
- function useFreezeWhile(open2) {
83767
- reactExports.useEffect(() => {
83768
- if (!open2) return;
83769
- return acquireFreezeHold();
83770
- }, [open2]);
83771
- }
83772
84037
  const DEFAULT_OPTIONS = {
83773
84038
  caseSensitive: false,
83774
84039
  wholeWord: false,
@@ -84309,10 +84574,12 @@ function AddressBarAutocomplete({ state: state2, onSelect }) {
84309
84574
  }
84310
84575
  function BrowserFindBar({ find: find2 }) {
84311
84576
  if (!find2.isOpen) return null;
84312
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
84577
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex shrink-0 justify-end px-4 py-1.5", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
84313
84578
  SearchBar,
84314
84579
  {
84315
84580
  ref: find2.searchBarRef,
84581
+ variant: "floating",
84582
+ className: "static",
84316
84583
  query: find2.query,
84317
84584
  onQueryChange: find2.setQuery,
84318
84585
  options: find2.options,
@@ -84324,7 +84591,7 @@ function BrowserFindBar({ find: find2 }) {
84324
84591
  onClose: find2.close,
84325
84592
  visibleOptions: ["caseSensitive"]
84326
84593
  }
84327
- );
84594
+ ) });
84328
84595
  }
84329
84596
  const SEARCH_DEBOUNCE_MS = 150;
84330
84597
  const LIST_LIMIT = 200;
@@ -111079,7 +111346,7 @@ var tn = f$5("block", "before:content-[counter(line)]", "before:inline-block", "
111079
111346
  var et$1 = ({ className: e3, language: t2, style: o3, isIncomplete: n2, ...s2 }) => jsxRuntimeExports.jsx("div", { className: f$5("my-4 flex w-full flex-col gap-2 rounded-xl border border-border bg-sidebar p-2", e3), "data-incomplete": n2 || void 0, "data-language": t2, "data-streamdown": "code-block", style: { contentVisibility: "auto", containIntrinsicSize: "auto 200px", ...o3 }, ...s2 });
111080
111347
  var Se$1 = reactExports.createContext({ code: "" }), de$2 = () => reactExports.useContext(Se$1);
111081
111348
  var ot$1 = ({ language: e3 }) => jsxRuntimeExports.jsx("div", { className: "flex h-8 items-center text-muted-foreground text-xs", "data-language": e3, "data-streamdown": "code-block-header", children: jsxRuntimeExports.jsx("span", { className: "ml-1 font-mono lowercase", children: e3 }) });
111082
- var cn = /\n+$/, dn = reactExports.lazy(() => import("./highlighted-body-B3W2YXNL-BRJTScpo.js").then((e3) => ({ default: e3.HighlightedCodeBlockBody }))), rt = ({ code: e3, language: t2, className: o3, children: n2, isIncomplete: s2 = false, ...r2 }) => {
111349
+ var cn = /\n+$/, dn = reactExports.lazy(() => import("./highlighted-body-B3W2YXNL-D96wFQIF.js").then((e3) => ({ default: e3.HighlightedCodeBlockBody }))), rt = ({ code: e3, language: t2, className: o3, children: n2, isIncomplete: s2 = false, ...r2 }) => {
111083
111350
  let i2 = reactExports.useMemo(() => e3.replace(cn, ""), [e3]), c2 = reactExports.useMemo(() => ({ bg: "transparent", fg: "inherit", tokens: i2.split(`
111084
111351
  `).map((a2) => [{ content: a2, color: "inherit", bgColor: "transparent", htmlStyle: {}, offset: 0 }]) }), [i2]);
111085
111352
  return jsxRuntimeExports.jsx(Se$1.Provider, { value: { code: e3 }, children: jsxRuntimeExports.jsxs(et$1, { isIncomplete: s2, language: t2, children: [jsxRuntimeExports.jsx(ot$1, { language: t2 }), n2 ? jsxRuntimeExports.jsx("div", { className: "pointer-events-none sticky top-2 z-10 -mt-10 flex h-8 items-center justify-end", children: jsxRuntimeExports.jsx("div", { className: "pointer-events-auto flex shrink-0 items-center gap-2 rounded-md border border-sidebar bg-sidebar/80 px-1.5 py-1 supports-[backdrop-filter]:bg-sidebar/70 supports-[backdrop-filter]:backdrop-blur", "data-streamdown": "code-block-actions", children: n2 }) }) : null, jsxRuntimeExports.jsx(reactExports.Suspense, { fallback: jsxRuntimeExports.jsx(Qe$1, { className: o3, language: t2, result: c2, ...r2 }), children: jsxRuntimeExports.jsx(dn, { className: o3, code: i2, language: t2, raw: c2, ...r2 }) })] }) });
@@ -111401,7 +111668,7 @@ var Dt = ({ children: e3, className: t2, onDownload: o3, onError: n2 }) => {
111401
111668
  }, []), jsxRuntimeExports.jsxs("div", { className: "relative", ref: i2, children: [jsxRuntimeExports.jsx("button", { className: f$5("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50", t2), disabled: c2, onClick: () => r2(!s2), title: "Download table", type: "button", children: e3 != null ? e3 : jsxRuntimeExports.jsx(Z$2, { size: 14 }) }), s2 ? jsxRuntimeExports.jsxs("div", { className: "absolute top-full right-0 z-10 mt-1 min-w-[120px] overflow-hidden rounded-md border border-border bg-background shadow-lg", children: [jsxRuntimeExports.jsx("button", { className: "w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40", onClick: () => a2("csv"), title: "Download table as CSV", type: "button", children: "CSV" }), jsxRuntimeExports.jsx("button", { className: "w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40", onClick: () => a2("markdown"), title: "Download table as Markdown", type: "button", children: "Markdown" })] }) : null] });
111402
111669
  };
111403
111670
  var Vt = ({ children: e3, className: t2, showControls: o3, ...n2 }) => jsxRuntimeExports.jsxs("div", { className: "my-4 flex flex-col gap-2 rounded-lg border border-border bg-sidebar p-2", "data-streamdown": "table-wrapper", children: [o3 ? jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-end gap-1", children: [jsxRuntimeExports.jsx(Ht, {}), jsxRuntimeExports.jsx(Dt, {})] }) : null, jsxRuntimeExports.jsx("div", { className: "border-collapse overflow-x-auto overscroll-y-auto rounded-md border border-border bg-background", children: jsxRuntimeExports.jsx("table", { className: f$5("w-full divide-y divide-border", t2), "data-streamdown": "table", ...n2, children: e3 }) })] });
111404
- var Jn = reactExports.lazy(() => import("./mermaid-3ZIDBTTL-BTOUM0ev.js").then((e3) => ({ default: e3.Mermaid }))), Kn = /language-([^\s]+)/;
111671
+ var Jn = reactExports.lazy(() => import("./mermaid-3ZIDBTTL-OXquaWS7.js").then((e3) => ({ default: e3.Mermaid }))), Kn = /language-([^\s]+)/;
111405
111672
  function ke$1(e3, t2) {
111406
111673
  if (!(e3 != null && e3.position || t2 != null && t2.position)) return true;
111407
111674
  if (!(e3 != null && e3.position && (t2 != null && t2.position))) return false;
@@ -164263,12 +164530,12 @@ var registerDefaultLayoutLoaders = /* @__PURE__ */ __name(() => {
164263
164530
  registerLayoutLoaders([
164264
164531
  {
164265
164532
  name: "dagre",
164266
- loader: /* @__PURE__ */ __name(async () => await import("./dagre-6UL2VRFP-CQWT1qH1.js"), "loader")
164533
+ loader: /* @__PURE__ */ __name(async () => await import("./dagre-6UL2VRFP-B7jTJSLw.js"), "loader")
164267
164534
  },
164268
164535
  ...[
164269
164536
  {
164270
164537
  name: "cose-bilkent",
164271
- loader: /* @__PURE__ */ __name(async () => await import("./cose-bilkent-S5V4N54A-KcHAEwzJ.js"), "loader")
164538
+ loader: /* @__PURE__ */ __name(async () => await import("./cose-bilkent-S5V4N54A-B9ae2Qdn.js"), "loader")
164272
164539
  }
164273
164540
  ]
164274
164541
  ]);
@@ -164707,7 +164974,7 @@ var detector = /* @__PURE__ */ __name((txt) => {
164707
164974
  return /^\s*C4Context|C4Container|C4Component|C4Dynamic|C4Deployment/.test(txt);
164708
164975
  }, "detector");
164709
164976
  var loader = /* @__PURE__ */ __name(async () => {
164710
- const { diagram: diagram2 } = await import("./c4Diagram-YG6GDRKO-CIA5eVV6.js");
164977
+ const { diagram: diagram2 } = await import("./c4Diagram-YG6GDRKO-DsFHmTD3.js");
164711
164978
  return { id, diagram: diagram2 };
164712
164979
  }, "loader");
164713
164980
  var plugin = {
@@ -164724,7 +164991,7 @@ var detector2 = /* @__PURE__ */ __name((txt, config2) => {
164724
164991
  return /^\s*graph/.test(txt);
164725
164992
  }, "detector");
164726
164993
  var loader2 = /* @__PURE__ */ __name(async () => {
164727
- const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-BfixH-Db.js");
164994
+ const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-D936EXJm.js");
164728
164995
  return { id: id2, diagram: diagram2 };
164729
164996
  }, "loader");
164730
164997
  var plugin2 = {
@@ -164747,7 +165014,7 @@ var detector3 = /* @__PURE__ */ __name((txt, config2) => {
164747
165014
  return /^\s*flowchart/.test(txt);
164748
165015
  }, "detector");
164749
165016
  var loader3 = /* @__PURE__ */ __name(async () => {
164750
- const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-BfixH-Db.js");
165017
+ const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-D936EXJm.js");
164751
165018
  return { id: id3, diagram: diagram2 };
164752
165019
  }, "loader");
164753
165020
  var plugin3 = {
@@ -164761,7 +165028,7 @@ var detector4 = /* @__PURE__ */ __name((txt) => {
164761
165028
  return /^\s*erDiagram/.test(txt);
164762
165029
  }, "detector");
164763
165030
  var loader4 = /* @__PURE__ */ __name(async () => {
164764
- const { diagram: diagram2 } = await import("./erDiagram-Q2GNP2WA-BKMMfe3p.js");
165031
+ const { diagram: diagram2 } = await import("./erDiagram-Q2GNP2WA-eOuplDm8.js");
164765
165032
  return { id: id4, diagram: diagram2 };
164766
165033
  }, "loader");
164767
165034
  var plugin4 = {
@@ -164775,7 +165042,7 @@ var detector5 = /* @__PURE__ */ __name((txt) => {
164775
165042
  return /^\s*gitGraph/.test(txt);
164776
165043
  }, "detector");
164777
165044
  var loader5 = /* @__PURE__ */ __name(async () => {
164778
- const { diagram: diagram2 } = await import("./gitGraphDiagram-V2S2FVAM-CojxDa8_.js");
165045
+ const { diagram: diagram2 } = await import("./gitGraphDiagram-V2S2FVAM-BySu09rG.js");
164779
165046
  return { id: id5, diagram: diagram2 };
164780
165047
  }, "loader");
164781
165048
  var plugin5 = {
@@ -164789,7 +165056,7 @@ var detector6 = /* @__PURE__ */ __name((txt) => {
164789
165056
  return /^\s*gantt/.test(txt);
164790
165057
  }, "detector");
164791
165058
  var loader6 = /* @__PURE__ */ __name(async () => {
164792
- const { diagram: diagram2 } = await import("./ganttDiagram-JELNMOA3-DFMW13wi.js");
165059
+ const { diagram: diagram2 } = await import("./ganttDiagram-JELNMOA3-BiN9iSoE.js");
164793
165060
  return { id: id6, diagram: diagram2 };
164794
165061
  }, "loader");
164795
165062
  var plugin6 = {
@@ -164803,7 +165070,7 @@ var detector7 = /* @__PURE__ */ __name((txt) => {
164803
165070
  return /^\s*info/.test(txt);
164804
165071
  }, "detector");
164805
165072
  var loader7 = /* @__PURE__ */ __name(async () => {
164806
- const { diagram: diagram2 } = await import("./infoDiagram-HS3SLOUP--nKUIx4y.js");
165073
+ const { diagram: diagram2 } = await import("./infoDiagram-HS3SLOUP-tw47oYSh.js");
164807
165074
  return { id: id7, diagram: diagram2 };
164808
165075
  }, "loader");
164809
165076
  var info = {
@@ -164816,7 +165083,7 @@ var detector8 = /* @__PURE__ */ __name((txt) => {
164816
165083
  return /^\s*pie/.test(txt);
164817
165084
  }, "detector");
164818
165085
  var loader8 = /* @__PURE__ */ __name(async () => {
164819
- const { diagram: diagram2 } = await import("./pieDiagram-ADFJNKIX-VNMmF9Za.js");
165086
+ const { diagram: diagram2 } = await import("./pieDiagram-ADFJNKIX-CaxKfDJS.js");
164820
165087
  return { id: id8, diagram: diagram2 };
164821
165088
  }, "loader");
164822
165089
  var pie = {
@@ -164829,7 +165096,7 @@ var detector9 = /* @__PURE__ */ __name((txt) => {
164829
165096
  return /^\s*quadrantChart/.test(txt);
164830
165097
  }, "detector");
164831
165098
  var loader9 = /* @__PURE__ */ __name(async () => {
164832
- const { diagram: diagram2 } = await import("./quadrantDiagram-AYHSOK5B-re6uOzo4.js");
165099
+ const { diagram: diagram2 } = await import("./quadrantDiagram-AYHSOK5B-Ca2xEu2r.js");
164833
165100
  return { id: id9, diagram: diagram2 };
164834
165101
  }, "loader");
164835
165102
  var plugin7 = {
@@ -164843,7 +165110,7 @@ var detector10 = /* @__PURE__ */ __name((txt) => {
164843
165110
  return /^\s*xychart(-beta)?/.test(txt);
164844
165111
  }, "detector");
164845
165112
  var loader10 = /* @__PURE__ */ __name(async () => {
164846
- const { diagram: diagram2 } = await import("./xychartDiagram-PRI3JC2R-B99wGKft.js");
165113
+ const { diagram: diagram2 } = await import("./xychartDiagram-PRI3JC2R-XawkKMC7.js");
164847
165114
  return { id: id10, diagram: diagram2 };
164848
165115
  }, "loader");
164849
165116
  var plugin8 = {
@@ -164857,7 +165124,7 @@ var detector11 = /* @__PURE__ */ __name((txt) => {
164857
165124
  return /^\s*requirement(Diagram)?/.test(txt);
164858
165125
  }, "detector");
164859
165126
  var loader11 = /* @__PURE__ */ __name(async () => {
164860
- const { diagram: diagram2 } = await import("./requirementDiagram-UZGBJVZJ-BImsyUnt.js");
165127
+ const { diagram: diagram2 } = await import("./requirementDiagram-UZGBJVZJ-Yu709R_p.js");
164861
165128
  return { id: id11, diagram: diagram2 };
164862
165129
  }, "loader");
164863
165130
  var plugin9 = {
@@ -164871,7 +165138,7 @@ var detector12 = /* @__PURE__ */ __name((txt) => {
164871
165138
  return /^\s*sequenceDiagram/.test(txt);
164872
165139
  }, "detector");
164873
165140
  var loader12 = /* @__PURE__ */ __name(async () => {
164874
- const { diagram: diagram2 } = await import("./sequenceDiagram-WL72ISMW-De8W2AXi.js");
165141
+ const { diagram: diagram2 } = await import("./sequenceDiagram-WL72ISMW-D1bV4VYq.js");
164875
165142
  return { id: id12, diagram: diagram2 };
164876
165143
  }, "loader");
164877
165144
  var plugin10 = {
@@ -164888,7 +165155,7 @@ var detector13 = /* @__PURE__ */ __name((txt, config2) => {
164888
165155
  return /^\s*classDiagram/.test(txt);
164889
165156
  }, "detector");
164890
165157
  var loader13 = /* @__PURE__ */ __name(async () => {
164891
- const { diagram: diagram2 } = await import("./classDiagram-2ON5EDUG-vj4N4uTP.js");
165158
+ const { diagram: diagram2 } = await import("./classDiagram-2ON5EDUG-CnPtqi4k.js");
164892
165159
  return { id: id13, diagram: diagram2 };
164893
165160
  }, "loader");
164894
165161
  var plugin11 = {
@@ -164905,7 +165172,7 @@ var detector14 = /* @__PURE__ */ __name((txt, config2) => {
164905
165172
  return /^\s*classDiagram-v2/.test(txt);
164906
165173
  }, "detector");
164907
165174
  var loader14 = /* @__PURE__ */ __name(async () => {
164908
- const { diagram: diagram2 } = await import("./classDiagram-v2-WZHVMYZB-vj4N4uTP.js");
165175
+ const { diagram: diagram2 } = await import("./classDiagram-v2-WZHVMYZB-CnPtqi4k.js");
164909
165176
  return { id: id14, diagram: diagram2 };
164910
165177
  }, "loader");
164911
165178
  var plugin12 = {
@@ -164922,7 +165189,7 @@ var detector15 = /* @__PURE__ */ __name((txt, config2) => {
164922
165189
  return /^\s*stateDiagram/.test(txt);
164923
165190
  }, "detector");
164924
165191
  var loader15 = /* @__PURE__ */ __name(async () => {
164925
- const { diagram: diagram2 } = await import("./stateDiagram-FKZM4ZOC-CslmqvhX.js");
165192
+ const { diagram: diagram2 } = await import("./stateDiagram-FKZM4ZOC-vLFbsrNj.js");
164926
165193
  return { id: id15, diagram: diagram2 };
164927
165194
  }, "loader");
164928
165195
  var plugin13 = {
@@ -164942,7 +165209,7 @@ var detector16 = /* @__PURE__ */ __name((txt, config2) => {
164942
165209
  return false;
164943
165210
  }, "detector");
164944
165211
  var loader16 = /* @__PURE__ */ __name(async () => {
164945
- const { diagram: diagram2 } = await import("./stateDiagram-v2-4FDKWEC3-BXVdfPdk.js");
165212
+ const { diagram: diagram2 } = await import("./stateDiagram-v2-4FDKWEC3-BKTZFre2.js");
164946
165213
  return { id: id16, diagram: diagram2 };
164947
165214
  }, "loader");
164948
165215
  var plugin14 = {
@@ -164956,7 +165223,7 @@ var detector17 = /* @__PURE__ */ __name((txt) => {
164956
165223
  return /^\s*journey/.test(txt);
164957
165224
  }, "detector");
164958
165225
  var loader17 = /* @__PURE__ */ __name(async () => {
164959
- const { diagram: diagram2 } = await import("./journeyDiagram-XKPGCS4Q-KjVGeKmm.js");
165226
+ const { diagram: diagram2 } = await import("./journeyDiagram-XKPGCS4Q-dlsRbD68.js");
164960
165227
  return { id: id17, diagram: diagram2 };
164961
165228
  }, "loader");
164962
165229
  var plugin15 = {
@@ -165023,7 +165290,7 @@ var detector18 = /* @__PURE__ */ __name((txt, config2 = {}) => {
165023
165290
  return false;
165024
165291
  }, "detector");
165025
165292
  var loader18 = /* @__PURE__ */ __name(async () => {
165026
- const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-BfixH-Db.js");
165293
+ const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-D936EXJm.js");
165027
165294
  return { id: id18, diagram: diagram2 };
165028
165295
  }, "loader");
165029
165296
  var plugin16 = {
@@ -165037,7 +165304,7 @@ var detector19 = /* @__PURE__ */ __name((txt) => {
165037
165304
  return /^\s*timeline/.test(txt);
165038
165305
  }, "detector");
165039
165306
  var loader19 = /* @__PURE__ */ __name(async () => {
165040
- const { diagram: diagram2 } = await import("./timeline-definition-IT6M3QCI-BrEcv0X7.js");
165307
+ const { diagram: diagram2 } = await import("./timeline-definition-IT6M3QCI-BoTxx0bm.js");
165041
165308
  return { id: id19, diagram: diagram2 };
165042
165309
  }, "loader");
165043
165310
  var plugin17 = {
@@ -165051,7 +165318,7 @@ var detector20 = /* @__PURE__ */ __name((txt) => {
165051
165318
  return /^\s*mindmap/.test(txt);
165052
165319
  }, "detector");
165053
165320
  var loader20 = /* @__PURE__ */ __name(async () => {
165054
- const { diagram: diagram2 } = await import("./mindmap-definition-VGOIOE7T--AIwUu6M.js");
165321
+ const { diagram: diagram2 } = await import("./mindmap-definition-VGOIOE7T-BhmQKdg9.js");
165055
165322
  return { id: id20, diagram: diagram2 };
165056
165323
  }, "loader");
165057
165324
  var plugin18 = {
@@ -165065,7 +165332,7 @@ var detector21 = /* @__PURE__ */ __name((txt) => {
165065
165332
  return /^\s*kanban/.test(txt);
165066
165333
  }, "detector");
165067
165334
  var loader21 = /* @__PURE__ */ __name(async () => {
165068
- const { diagram: diagram2 } = await import("./kanban-definition-3W4ZIXB7-aISJLxn5.js");
165335
+ const { diagram: diagram2 } = await import("./kanban-definition-3W4ZIXB7-BY-i-k2L.js");
165069
165336
  return { id: id21, diagram: diagram2 };
165070
165337
  }, "loader");
165071
165338
  var plugin19 = {
@@ -165079,7 +165346,7 @@ var detector22 = /* @__PURE__ */ __name((txt) => {
165079
165346
  return /^\s*sankey(-beta)?/.test(txt);
165080
165347
  }, "detector");
165081
165348
  var loader22 = /* @__PURE__ */ __name(async () => {
165082
- const { diagram: diagram2 } = await import("./sankeyDiagram-TZEHDZUN-BdxA5ccl.js");
165349
+ const { diagram: diagram2 } = await import("./sankeyDiagram-TZEHDZUN-B-IfXZ0G.js");
165083
165350
  return { id: id22, diagram: diagram2 };
165084
165351
  }, "loader");
165085
165352
  var plugin20 = {
@@ -165093,7 +165360,7 @@ var detector23 = /* @__PURE__ */ __name((txt) => {
165093
165360
  return /^\s*packet(-beta)?/.test(txt);
165094
165361
  }, "detector");
165095
165362
  var loader23 = /* @__PURE__ */ __name(async () => {
165096
- const { diagram: diagram2 } = await import("./diagram-S2PKOQOG-BM39hxHa.js");
165363
+ const { diagram: diagram2 } = await import("./diagram-S2PKOQOG-DmG_O45F.js");
165097
165364
  return { id: id23, diagram: diagram2 };
165098
165365
  }, "loader");
165099
165366
  var packet = {
@@ -165106,7 +165373,7 @@ var detector24 = /* @__PURE__ */ __name((txt) => {
165106
165373
  return /^\s*radar-beta/.test(txt);
165107
165374
  }, "detector");
165108
165375
  var loader24 = /* @__PURE__ */ __name(async () => {
165109
- const { diagram: diagram2 } = await import("./diagram-QEK2KX5R-AmngkeIE.js");
165376
+ const { diagram: diagram2 } = await import("./diagram-QEK2KX5R-CIAMWYgF.js");
165110
165377
  return { id: id24, diagram: diagram2 };
165111
165378
  }, "loader");
165112
165379
  var radar = {
@@ -165119,7 +165386,7 @@ var detector25 = /* @__PURE__ */ __name((txt) => {
165119
165386
  return /^\s*block(-beta)?/.test(txt);
165120
165387
  }, "detector");
165121
165388
  var loader25 = /* @__PURE__ */ __name(async () => {
165122
- const { diagram: diagram2 } = await import("./blockDiagram-VD42YOAC-ZfA3oZiS.js");
165389
+ const { diagram: diagram2 } = await import("./blockDiagram-VD42YOAC-Dg_flni_.js");
165123
165390
  return { id: id25, diagram: diagram2 };
165124
165391
  }, "loader");
165125
165392
  var plugin21 = {
@@ -165133,7 +165400,7 @@ var detector26 = /* @__PURE__ */ __name((txt) => {
165133
165400
  return /^\s*architecture/.test(txt);
165134
165401
  }, "detector");
165135
165402
  var loader26 = /* @__PURE__ */ __name(async () => {
165136
- const { diagram: diagram2 } = await import("./architectureDiagram-VXUJARFQ-5uniqAHc.js");
165403
+ const { diagram: diagram2 } = await import("./architectureDiagram-VXUJARFQ-DkchSxdX.js");
165137
165404
  return { id: id26, diagram: diagram2 };
165138
165405
  }, "loader");
165139
165406
  var architecture = {
@@ -165147,7 +165414,7 @@ var detector27 = /* @__PURE__ */ __name((txt) => {
165147
165414
  return /^\s*treemap/.test(txt);
165148
165415
  }, "detector");
165149
165416
  var loader27 = /* @__PURE__ */ __name(async () => {
165150
- const { diagram: diagram2 } = await import("./diagram-PSM6KHXK-C522aWwF.js");
165417
+ const { diagram: diagram2 } = await import("./diagram-PSM6KHXK-zpQZfPMx.js");
165151
165418
  return { id: id27, diagram: diagram2 };
165152
165419
  }, "loader");
165153
165420
  var treemap = {
@@ -170629,6 +170896,7 @@ function CronjobsPageContent() {
170629
170896
  variant: "outline",
170630
170897
  size: "xs",
170631
170898
  className: "hidden sm:inline-flex",
170899
+ "data-testid": "cronjobs__new-button",
170632
170900
  onClick: handleCreate,
170633
170901
  children: [
170634
170902
  /* @__PURE__ */ jsxRuntimeExports.jsx(Plus, { className: "size-3" }),
@@ -170965,8 +171233,19 @@ function CronjobDialog({
170965
171233
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2", children: [
170966
171234
  /* @__PURE__ */ jsxRuntimeExports.jsx(Label$1, { children: "Project" }),
170967
171235
  /* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { value: selectedProject, onValueChange: handleProjectChange, children: [
170968
- /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: "Select a project" }) }),
170969
- /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: projects.map((p2) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: p2.name, children: p2.name }, p2.name)) })
171236
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { "data-testid": "cronjobs__project-select", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: "Select a project" }) }),
171237
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: projects.map((p2) => /* @__PURE__ */ jsxRuntimeExports.jsxs(SelectItem, { value: p2.name, children: [
171238
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
171239
+ ProjectAvatar,
171240
+ {
171241
+ avatar: p2.avatar,
171242
+ className: "size-4",
171243
+ fallback: null,
171244
+ testId: `cronjobs__project-avatar--${p2.name}`
171245
+ }
171246
+ ),
171247
+ p2.name
171248
+ ] }, p2.name)) })
170970
171249
  ] })
170971
171250
  ] }),
170972
171251
  scope === "workspace" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2", children: [
@@ -193904,7 +194183,7 @@ function SharedDockviewLayout() {
193904
194183
  ] });
193905
194184
  }
193906
194185
  const TerminalPanel = reactExports.lazy(
193907
- () => import("./TerminalPanel-Br6bnerp.js").then((m2) => ({ default: m2.TerminalPanel }))
194186
+ () => import("./TerminalPanel-DwiK0a7O.js").then((m2) => ({ default: m2.TerminalPanel }))
193908
194187
  );
193909
194188
  const nestedTheme = {
193910
194189
  name: "band",
@@ -194769,6 +195048,7 @@ function useLeafFind(workspaceId, visible, previewSearch) {
194769
195048
  SearchBar,
194770
195049
  {
194771
195050
  ref: search2.searchBarRef,
195051
+ variant: "floating",
194772
195052
  query: search2.searchQuery,
194773
195053
  onQueryChange: (q2) => {
194774
195054
  search2.setSearchQuery(q2);
@@ -195039,7 +195319,7 @@ function FileLeaf({ params, api }) {
195039
195319
  },
195040
195320
  renderMarkdown,
195041
195321
  onEditorView: handleEditorView,
195042
- toolbar: searchBar,
195322
+ overlay: searchBar,
195043
195323
  savedSelection: persisted?.selection,
195044
195324
  savedScrollTop: persisted?.scrollTop,
195045
195325
  initialEditedContent: persisted?.editedContent ?? null,
@@ -195178,8 +195458,8 @@ function DiffLeaf({ params, api, containerApi }) {
195178
195458
  className: "flex h-full w-full flex-col overflow-hidden",
195179
195459
  "data-testid": `center-diff-leaf__visible-${visible ? "true" : "false"}`,
195180
195460
  children: [
195181
- searchBar,
195182
195461
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative min-h-0 flex-1", children: [
195462
+ searchBar,
195183
195463
  /* @__PURE__ */ jsxRuntimeExports.jsx(
195184
195464
  "div",
195185
195465
  {
@@ -197178,6 +197458,18 @@ function saveRightPanelCollapsed(collapsed) {
197178
197458
  }
197179
197459
  const RIGHT_PANEL_MIN_SIZE = "15rem";
197180
197460
  const RIGHT_PANEL_MAX_SIZE = "60%";
197461
+ const TRANSLUCENT_SIDEBAR_ATTR = "data-translucent-sidebar";
197462
+ const TRANSLUCENT_SIDEBAR_STORAGE_KEY = "band:translucent-sidebar";
197463
+ const supportsTranslucentSidebar = isDesktop && typeof navigator !== "undefined" && /Mac/.test(navigator.userAgent);
197464
+ const TRANSLUCENT_SIDEBAR_INIT_SCRIPT = `(function(){try{if(!("__BAND_DESKTOP__" in window)||!/Mac/.test(navigator.userAgent))return;if(localStorage.getItem(${JSON.stringify(TRANSLUCENT_SIDEBAR_STORAGE_KEY)})==="0")return;document.documentElement.setAttribute(${JSON.stringify(TRANSLUCENT_SIDEBAR_ATTR)},"")}catch(e){}})()`;
197465
+ function applyTranslucentSidebar(enabled) {
197466
+ const on2 = enabled && supportsTranslucentSidebar;
197467
+ document.documentElement.toggleAttribute(TRANSLUCENT_SIDEBAR_ATTR, on2);
197468
+ try {
197469
+ localStorage.setItem(TRANSLUCENT_SIDEBAR_STORAGE_KEY, enabled ? "1" : "0");
197470
+ } catch {
197471
+ }
197472
+ }
197181
197473
  const adapter = isDesktop ? new DesktopDashboardAdapter() : new WebDashboardAdapter();
197182
197474
  const capabilities = isDesktop ? new NativeShellCapabilities() : new WebCapabilities();
197183
197475
  const Route$2 = createRootRoute({
@@ -197246,6 +197538,16 @@ function ThemeSync() {
197246
197538
  }, []);
197247
197539
  return null;
197248
197540
  }
197541
+ function TranslucentSidebarSync() {
197542
+ const { settings, isLoading, error } = useSettingsQuery();
197543
+ const enabled = settings.translucentSidebar ?? true;
197544
+ const loaded = !isLoading && !error;
197545
+ reactExports.useEffect(() => {
197546
+ if (!loaded) return;
197547
+ applyTranslucentSidebar(enabled);
197548
+ }, [enabled, loaded]);
197549
+ return null;
197550
+ }
197249
197551
  function ReloadSync() {
197250
197552
  reactExports.useEffect(() => {
197251
197553
  const globalKey = "__bandReload";
@@ -197556,7 +197858,7 @@ function AppShell() {
197556
197858
  if (!useDesktopLayout) {
197557
197859
  return /* @__PURE__ */ jsxRuntimeExports.jsx(Outlet, {});
197558
197860
  }
197559
- return /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarOverflowProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative flex flex-col h-full w-full overflow-hidden bg-background text-foreground", children: [
197861
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarOverflowProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative flex flex-col h-full w-full overflow-hidden bg-background text-foreground translucent-sidebar:bg-transparent", children: [
197560
197862
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 min-h-0 overflow-hidden", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
197561
197863
  Ut$1,
197562
197864
  {
@@ -197580,7 +197882,7 @@ function AppShell() {
197580
197882
  children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
197581
197883
  "div",
197582
197884
  {
197583
- className: "h-full flex flex-col overflow-hidden border-r border-border bg-sidebar pb-[env(safe-area-inset-bottom)]",
197885
+ className: "h-full flex flex-col overflow-hidden border-r border-border bg-sidebar translucent-sidebar:bg-(--sidebar-translucent) pb-[env(safe-area-inset-bottom)]",
197584
197886
  "data-testid": "app-shell__sidebar",
197585
197887
  children: [
197586
197888
  /* @__PURE__ */ jsxRuntimeExports.jsx(SidebarTitleBar, {}),
@@ -197590,8 +197892,8 @@ function AppShell() {
197590
197892
  )
197591
197893
  }
197592
197894
  ),
197593
- /* @__PURE__ */ jsxRuntimeExports.jsx(Qt$1, { className: "w-[3px] bg-transparent hover:bg-accent-foreground/20 active:bg-accent-foreground/30 transition-colors cursor-col-resize" }),
197594
- /* @__PURE__ */ jsxRuntimeExports.jsx(Yt$1, { id: "main", elementRef: mainElRef, minSize: "20%", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "h-full flex flex-col min-w-0 overflow-hidden pb-[env(safe-area-inset-bottom)]", children: [
197895
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Qt$1, { className: "w-[3px] bg-background hover:bg-[color-mix(in_srgb,var(--accent-foreground)_20%,var(--background))] active:bg-[color-mix(in_srgb,var(--accent-foreground)_30%,var(--background))] transition-colors cursor-col-resize" }),
197896
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Yt$1, { id: "main", elementRef: mainElRef, minSize: "20%", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "h-full flex flex-col min-w-0 overflow-hidden bg-background pb-[env(safe-area-inset-bottom)]", children: [
197595
197897
  /* @__PURE__ */ jsxRuntimeExports.jsx(
197596
197898
  WorkspaceTitleBar,
197597
197899
  {
@@ -197662,25 +197964,30 @@ function RootLayout() {
197662
197964
  /* @__PURE__ */ jsxRuntimeExports.jsxs("head", { children: [
197663
197965
  /* @__PURE__ */ jsxRuntimeExports.jsx(HeadContent, {}),
197664
197966
  /* @__PURE__ */ jsxRuntimeExports.jsx("script", { dangerouslySetInnerHTML: { __html: THEME_INIT_SCRIPT } }),
197665
- /* @__PURE__ */ jsxRuntimeExports.jsx("script", { dangerouslySetInnerHTML: { __html: ZOOM_INIT_SCRIPT } })
197967
+ /* @__PURE__ */ jsxRuntimeExports.jsx("script", { dangerouslySetInnerHTML: { __html: ZOOM_INIT_SCRIPT } }),
197968
+ /* @__PURE__ */ jsxRuntimeExports.jsx("script", { dangerouslySetInnerHTML: { __html: TRANSLUCENT_SIDEBAR_INIT_SCRIPT } })
197666
197969
  ] }),
197667
197970
  /* @__PURE__ */ jsxRuntimeExports.jsxs("body", { children: [
197668
197971
  /* @__PURE__ */ jsxRuntimeExports.jsxs(DashboardProvider, { adapter, capabilities, children: [
197669
197972
  /* @__PURE__ */ jsxRuntimeExports.jsx(ThemeSync, {}),
197973
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TranslucentSidebarSync, {}),
197670
197974
  /* @__PURE__ */ jsxRuntimeExports.jsx(ZoomSync, {}),
197671
197975
  /* @__PURE__ */ jsxRuntimeExports.jsx(ReloadSync, {}),
197672
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(AppShell, {}) })
197976
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(TooltipProvider, { children: [
197977
+ /* @__PURE__ */ jsxRuntimeExports.jsx(AppShell, {}),
197978
+ /* @__PURE__ */ jsxRuntimeExports.jsx(UpdateToast, {})
197979
+ ] })
197673
197980
  ] }),
197674
197981
  /* @__PURE__ */ jsxRuntimeExports.jsx(Scripts, {})
197675
197982
  ] })
197676
197983
  ] });
197677
197984
  }
197678
- const $$splitComponentImporter$1 = () => import("./index-BD2aoqcU.js");
197985
+ const $$splitComponentImporter$1 = () => import("./index-DKHXjVjQ.js");
197679
197986
  const Route$1 = createFileRoute("/")({
197680
197987
  component: lazyRouteComponent($$splitComponentImporter$1, "component")
197681
197988
  });
197682
- const $$splitNotFoundComponentImporter = () => import("./workspace._workspaceId-DMfwrjZz.js");
197683
- const $$splitComponentImporter = () => import("./workspace._workspaceId-DSom1njg.js");
197989
+ const $$splitNotFoundComponentImporter = () => import("./workspace._workspaceId-DivWn3Sp.js");
197990
+ const $$splitComponentImporter = () => import("./workspace._workspaceId-C-QhWzy_.js");
197684
197991
  const Route2 = createFileRoute("/workspace/$workspaceId")({
197685
197992
  component: lazyRouteComponent($$splitComponentImporter, "component"),
197686
197993
  // Bookmarks / shared links from before route unification (`/workspace/$id/changes`,