@cosmicstack/mercury-agent 1.1.9 → 1.1.12
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.
- package/README.md +101 -1
- package/README.zh-CN.md +265 -140
- package/dist/index.js +4473 -1842
- package/dist/index.js.map +1 -1
- package/dist/web/ui/assets/{Chat-DCFkzIwn.js → Chat-DXSn2dY8.js} +2 -2
- package/dist/web/ui/assets/{Chat-DCFkzIwn.js.map → Chat-DXSn2dY8.js.map} +1 -1
- package/dist/web/ui/assets/{Dashboard-B81ollv8.js → Dashboard-1rlAqQ-Y.js} +2 -2
- package/dist/web/ui/assets/{Dashboard-B81ollv8.js.map → Dashboard-1rlAqQ-Y.js.map} +1 -1
- package/dist/web/ui/assets/{Goals-D0cR8yIP.js → Goals-CgSUAXLH.js} +2 -2
- package/dist/web/ui/assets/{Goals-D0cR8yIP.js.map → Goals-CgSUAXLH.js.map} +1 -1
- package/dist/web/ui/assets/{Graph-C3eHp3_J.js → Graph-DnlOWkay.js} +2 -2
- package/dist/web/ui/assets/{Graph-C3eHp3_J.js.map → Graph-DnlOWkay.js.map} +1 -1
- package/dist/web/ui/assets/{Kanban-DrkTRyni.js → Kanban-DRlNiNRF.js} +2 -2
- package/dist/web/ui/assets/{Kanban-DrkTRyni.js.map → Kanban-DRlNiNRF.js.map} +1 -1
- package/dist/web/ui/assets/{Login-GRQ-LjgN.js → Login-BP5524pC.js} +2 -2
- package/dist/web/ui/assets/{Login-GRQ-LjgN.js.map → Login-BP5524pC.js.map} +1 -1
- package/dist/web/ui/assets/{MarkdownRenderer-Dvh1jwyj.js → MarkdownRenderer-B9KGVD0X.js} +2 -2
- package/dist/web/ui/assets/{MarkdownRenderer-Dvh1jwyj.js.map → MarkdownRenderer-B9KGVD0X.js.map} +1 -1
- package/dist/web/ui/assets/{Memory-dAZsKmWz.js → Memory-BOQEY0H8.js} +2 -2
- package/dist/web/ui/assets/{Memory-dAZsKmWz.js.map → Memory-BOQEY0H8.js.map} +1 -1
- package/dist/web/ui/assets/{Permissions-DCiyUUfI.js → Permissions-jbFH-toa.js} +2 -2
- package/dist/web/ui/assets/{Permissions-DCiyUUfI.js.map → Permissions-jbFH-toa.js.map} +1 -1
- package/dist/web/ui/assets/{PersonDetail-iZgApJog.js → PersonDetail-Ca8B9io8.js} +2 -2
- package/dist/web/ui/assets/{PersonDetail-iZgApJog.js.map → PersonDetail-Ca8B9io8.js.map} +1 -1
- package/dist/web/ui/assets/{Persons-Bs_HhYjC.js → Persons-epdmUeBM.js} +2 -2
- package/dist/web/ui/assets/{Persons-Bs_HhYjC.js.map → Persons-epdmUeBM.js.map} +1 -1
- package/dist/web/ui/assets/{Providers-CL6wMWni.js → Providers-Bm8sZNZo.js} +2 -2
- package/dist/web/ui/assets/{Providers-CL6wMWni.js.map → Providers-Bm8sZNZo.js.map} +1 -1
- package/dist/web/ui/assets/{Schedules-BQwE1hP5.js → Schedules-BZKhm9R7.js} +2 -2
- package/dist/web/ui/assets/{Schedules-BQwE1hP5.js.map → Schedules-BZKhm9R7.js.map} +1 -1
- package/dist/web/ui/assets/{Settings-26SF-okR.js → Settings-Hii-5oku.js} +2 -2
- package/dist/web/ui/assets/{Settings-26SF-okR.js.map → Settings-Hii-5oku.js.map} +1 -1
- package/dist/web/ui/assets/Skills-BHJp2CgD.js +17 -0
- package/dist/web/ui/assets/Skills-BHJp2CgD.js.map +1 -0
- package/dist/web/ui/assets/{Tasks-DbwRozzx.js → Tasks-D36pqkro.js} +2 -2
- package/dist/web/ui/assets/{Tasks-DbwRozzx.js.map → Tasks-D36pqkro.js.map} +1 -1
- package/dist/web/ui/assets/{Usage-i_q6Ri4s.js → Usage-CmjaYrsT.js} +2 -2
- package/dist/web/ui/assets/{Usage-i_q6Ri4s.js.map → Usage-CmjaYrsT.js.map} +1 -1
- package/dist/web/ui/assets/{Workspace-ZR5syf-9.js → Workspace-BYLf-wTJ.js} +2 -2
- package/dist/web/ui/assets/{Workspace-ZR5syf-9.js.map → Workspace-BYLf-wTJ.js.map} +1 -1
- package/dist/web/ui/assets/{activity-CIP1IzSg.js → activity-MOTqH8zM.js} +2 -2
- package/dist/web/ui/assets/{activity-CIP1IzSg.js.map → activity-MOTqH8zM.js.map} +1 -1
- package/dist/web/ui/assets/{alert-dialog-CW-j2nG4.js → alert-dialog-MbYSbZx5.js} +2 -2
- package/dist/web/ui/assets/{alert-dialog-CW-j2nG4.js.map → alert-dialog-MbYSbZx5.js.map} +1 -1
- package/dist/web/ui/assets/{arrow-left-D2YO-iMS.js → arrow-left-CtqQsBC6.js} +2 -2
- package/dist/web/ui/assets/{arrow-left-D2YO-iMS.js.map → arrow-left-CtqQsBC6.js.map} +1 -1
- package/dist/web/ui/assets/{avatar-BLsf3GhK.js → avatar-BIYaY7pR.js} +2 -2
- package/dist/web/ui/assets/{avatar-BLsf3GhK.js.map → avatar-BIYaY7pR.js.map} +1 -1
- package/dist/web/ui/assets/{badge-DfDJNUtd.js → badge-CUJiWF1y.js} +2 -2
- package/dist/web/ui/assets/{badge-DfDJNUtd.js.map → badge-CUJiWF1y.js.map} +1 -1
- package/dist/web/ui/assets/{button-TaFPR-zy.js → button-CNasMlFE.js} +2 -2
- package/dist/web/ui/assets/{button-TaFPR-zy.js.map → button-CNasMlFE.js.map} +1 -1
- package/dist/web/ui/assets/{card-DAYo4Zl5.js → card-BdsEOP7t.js} +2 -2
- package/dist/web/ui/assets/{card-DAYo4Zl5.js.map → card-BdsEOP7t.js.map} +1 -1
- package/dist/web/ui/assets/{chevron-down-CQi0yuay.js → chevron-down-CB9J_vvZ.js} +2 -2
- package/dist/web/ui/assets/{chevron-down-CQi0yuay.js.map → chevron-down-CB9J_vvZ.js.map} +1 -1
- package/dist/web/ui/assets/{circle-check-DweDcOkA.js → circle-check-DvGSe1uZ.js} +2 -2
- package/dist/web/ui/assets/{circle-check-DweDcOkA.js.map → circle-check-DvGSe1uZ.js.map} +1 -1
- package/dist/web/ui/assets/{circle-x-BmL20etA.js → circle-x-CyaGJ_BM.js} +2 -2
- package/dist/web/ui/assets/{circle-x-BmL20etA.js.map → circle-x-CyaGJ_BM.js.map} +1 -1
- package/dist/web/ui/assets/{dialog-DovgkMhT.js → dialog-Bd1rELXb.js} +2 -2
- package/dist/web/ui/assets/{dialog-DovgkMhT.js.map → dialog-Bd1rELXb.js.map} +1 -1
- package/dist/web/ui/assets/{download-_QBatDio.js → download-C8RvlFqO.js} +2 -2
- package/dist/web/ui/assets/{download-_QBatDio.js.map → download-C8RvlFqO.js.map} +1 -1
- package/dist/web/ui/assets/{eye-Wpgtfmgw.js → eye-BJ0NucMz.js} +2 -2
- package/dist/web/ui/assets/{eye-Wpgtfmgw.js.map → eye-BJ0NucMz.js.map} +1 -1
- package/dist/web/ui/assets/{file-text-2EGFNyc1.js → file-text-BWWBuD_N.js} +2 -2
- package/dist/web/ui/assets/{file-text-2EGFNyc1.js.map → file-text-BWWBuD_N.js.map} +1 -1
- package/dist/web/ui/assets/{folder-open-C-OiZn9P.js → folder-open-BwjemFy7.js} +2 -2
- package/dist/web/ui/assets/{folder-open-C-OiZn9P.js.map → folder-open-BwjemFy7.js.map} +1 -1
- package/dist/web/ui/assets/{git-branch-BT9gCKgG.js → git-branch-D9JVASpC.js} +2 -2
- package/dist/web/ui/assets/{git-branch-BT9gCKgG.js.map → git-branch-D9JVASpC.js.map} +1 -1
- package/dist/web/ui/assets/{index-BhxU0YlT.js → index-C3YiF4qv.js} +6 -6
- package/dist/web/ui/assets/index-C3YiF4qv.js.map +1 -0
- package/dist/web/ui/assets/{index-CUT6Fr2C.js → index-CaqLZNof.js} +2 -2
- package/dist/web/ui/assets/{index-CUT6Fr2C.js.map → index-CaqLZNof.js.map} +1 -1
- package/dist/web/ui/assets/index-CuhiuVab.css +1 -0
- package/dist/web/ui/assets/{input-L1uz5xAQ.js → input-CH3dmo9r.js} +2 -2
- package/dist/web/ui/assets/{input-L1uz5xAQ.js.map → input-CH3dmo9r.js.map} +1 -1
- package/dist/web/ui/assets/{loader-circle-BTFgt3hG.js → loader-circle-DbYKk0_Q.js} +2 -2
- package/dist/web/ui/assets/{loader-circle-BTFgt3hG.js.map → loader-circle-DbYKk0_Q.js.map} +1 -1
- package/dist/web/ui/assets/{pencil-uxK07iYy.js → pencil-gNDEMhav.js} +2 -2
- package/dist/web/ui/assets/{pencil-uxK07iYy.js.map → pencil-gNDEMhav.js.map} +1 -1
- package/dist/web/ui/assets/{plus-DcWFYr4m.js → plus-7rbHkByr.js} +2 -2
- package/dist/web/ui/assets/{plus-DcWFYr4m.js.map → plus-7rbHkByr.js.map} +1 -1
- package/dist/web/ui/assets/{power-DVIqVIMj.js → power-BS7gCDWs.js} +2 -2
- package/dist/web/ui/assets/{power-DVIqVIMj.js.map → power-BS7gCDWs.js.map} +1 -1
- package/dist/web/ui/assets/{progress-DMwOdxli.js → progress-ZzhsBV2v.js} +2 -2
- package/dist/web/ui/assets/{progress-DMwOdxli.js.map → progress-ZzhsBV2v.js.map} +1 -1
- package/dist/web/ui/assets/{search-D1OOxb1X.js → search-BZsbhO0B.js} +2 -2
- package/dist/web/ui/assets/{search-D1OOxb1X.js.map → search-BZsbhO0B.js.map} +1 -1
- package/dist/web/ui/assets/{select-Dnx_bUgy.js → select-vRSgBrHz.js} +2 -2
- package/dist/web/ui/assets/{select-Dnx_bUgy.js.map → select-vRSgBrHz.js.map} +1 -1
- package/dist/web/ui/assets/{send-D4uxqmyH.js → send-BkyTIUtJ.js} +2 -2
- package/dist/web/ui/assets/{send-D4uxqmyH.js.map → send-BkyTIUtJ.js.map} +1 -1
- package/dist/web/ui/assets/{sparkles-DLSJA4xU.js → sparkles-DcP24GEL.js} +2 -2
- package/dist/web/ui/assets/{sparkles-DLSJA4xU.js.map → sparkles-DcP24GEL.js.map} +1 -1
- package/dist/web/ui/assets/{switch-CvDDbCUA.js → switch-LRN9wWy2.js} +2 -2
- package/dist/web/ui/assets/{switch-CvDDbCUA.js.map → switch-LRN9wWy2.js.map} +1 -1
- package/dist/web/ui/assets/{terminal-DI3J3W_z.js → terminal-CWG62zdD.js} +2 -2
- package/dist/web/ui/assets/{terminal-DI3J3W_z.js.map → terminal-CWG62zdD.js.map} +1 -1
- package/dist/web/ui/assets/{textarea-CXLsr8tf.js → textarea-CXh3tmJ1.js} +2 -2
- package/dist/web/ui/assets/{textarea-CXLsr8tf.js.map → textarea-CXh3tmJ1.js.map} +1 -1
- package/dist/web/ui/assets/{zap-C-0oH5gt.js → zap-BEfqVtvZ.js} +2 -2
- package/dist/web/ui/assets/{zap-C-0oH5gt.js.map → zap-BEfqVtvZ.js.map} +1 -1
- package/dist/web/ui/index.html +2 -2
- package/package.json +9 -4
- package/dist/web/ui/assets/Skills-DANyYK_d.js +0 -7
- package/dist/web/ui/assets/Skills-DANyYK_d.js.map +0 -1
- package/dist/web/ui/assets/index-BhxU0YlT.js.map +0 -1
- package/dist/web/ui/assets/index-DOw1nKre.css +0 -1
- package/dist/web/ui/sw.js.map +0 -1
- package/dist/web/ui/workbox-0bb07689.js +0 -3
- package/dist/web/ui/workbox-0bb07689.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Workspace-ZR5syf-9.js","sources":["../../node_modules/lucide-react/dist/esm/icons/circle.js","../../node_modules/lucide-react/dist/esm/icons/file-code.js","../../node_modules/lucide-react/dist/esm/icons/folder-input.js","../../node_modules/lucide-react/dist/esm/icons/folder-tree.js","../../node_modules/lucide-react/dist/esm/icons/git-commit-horizontal.js","../../node_modules/lucide-react/dist/esm/icons/maximize-2.js","../../node_modules/lucide-react/dist/esm/icons/minimize-2.js","../../node_modules/lucide-react/dist/esm/icons/minus.js","../../node_modules/lucide-react/dist/esm/icons/refresh-cw.js","../../node_modules/lucide-react/dist/esm/icons/upload.js","../../src/pages/Workspace.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }]];\nconst Circle = createLucideIcon(\"circle\", __iconNode);\n\nexport { __iconNode, Circle as default };\n//# sourceMappingURL=circle.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 12.5 8 15l2 2.5\", key: \"1tg20x\" }],\n [\"path\", { d: \"m14 12.5 2 2.5-2 2.5\", key: \"yinavb\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n [\"path\", { d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z\", key: \"1mlx9k\" }]\n];\nconst FileCode = createLucideIcon(\"file-code\", __iconNode);\n\nexport { __iconNode, FileCode as default };\n//# sourceMappingURL=file-code.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M2 9V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-1\",\n key: \"fm4g5t\"\n }\n ],\n [\"path\", { d: \"M2 13h10\", key: \"pgb2dq\" }],\n [\"path\", { d: \"m9 16 3-3-3-3\", key: \"6m91ic\" }]\n];\nconst FolderInput = createLucideIcon(\"folder-input\", __iconNode);\n\nexport { __iconNode, FolderInput as default };\n//# sourceMappingURL=folder-input.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M20 10a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2.5a1 1 0 0 1-.8-.4l-.9-1.2A1 1 0 0 0 15 3h-2a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z\",\n key: \"hod4my\"\n }\n ],\n [\n \"path\",\n {\n d: \"M20 21a1 1 0 0 0 1-1v-3a1 1 0 0 0-1-1h-2.9a1 1 0 0 1-.88-.55l-.42-.85a1 1 0 0 0-.92-.6H13a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z\",\n key: \"w4yl2u\"\n }\n ],\n [\"path\", { d: \"M3 5a2 2 0 0 0 2 2h3\", key: \"f2jnh7\" }],\n [\"path\", { d: \"M3 3v13a2 2 0 0 0 2 2h3\", key: \"k8epm1\" }]\n];\nconst FolderTree = createLucideIcon(\"folder-tree\", __iconNode);\n\nexport { __iconNode, FolderTree as default };\n//# sourceMappingURL=folder-tree.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }],\n [\"line\", { x1: \"3\", x2: \"9\", y1: \"12\", y2: \"12\", key: \"1dyftd\" }],\n [\"line\", { x1: \"15\", x2: \"21\", y1: \"12\", y2: \"12\", key: \"oup4p8\" }]\n];\nconst GitCommitHorizontal = createLucideIcon(\"git-commit-horizontal\", __iconNode);\n\nexport { __iconNode, GitCommitHorizontal as default };\n//# sourceMappingURL=git-commit-horizontal.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M15 3h6v6\", key: \"1q9fwt\" }],\n [\"path\", { d: \"m21 3-7 7\", key: \"1l2asr\" }],\n [\"path\", { d: \"m3 21 7-7\", key: \"tjx5ai\" }],\n [\"path\", { d: \"M9 21H3v-6\", key: \"wtvkvv\" }]\n];\nconst Maximize2 = createLucideIcon(\"maximize-2\", __iconNode);\n\nexport { __iconNode, Maximize2 as default };\n//# sourceMappingURL=maximize-2.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m14 10 7-7\", key: \"oa77jy\" }],\n [\"path\", { d: \"M20 10h-6V4\", key: \"mjg0md\" }],\n [\"path\", { d: \"m3 21 7-7\", key: \"tjx5ai\" }],\n [\"path\", { d: \"M4 14h6v6\", key: \"rmj7iw\" }]\n];\nconst Minimize2 = createLucideIcon(\"minimize-2\", __iconNode);\n\nexport { __iconNode, Minimize2 as default };\n//# sourceMappingURL=minimize-2.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }]];\nconst Minus = createLucideIcon(\"minus\", __iconNode);\n\nexport { __iconNode, Minus as default };\n//# sourceMappingURL=minus.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\", key: \"v9h5vc\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }],\n [\"path\", { d: \"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\", key: \"3uifl3\" }],\n [\"path\", { d: \"M8 16H3v5\", key: \"1cv678\" }]\n];\nconst RefreshCw = createLucideIcon(\"refresh-cw\", __iconNode);\n\nexport { __iconNode, RefreshCw as default };\n//# sourceMappingURL=refresh-cw.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 3v12\", key: \"1x0j5s\" }],\n [\"path\", { d: \"m17 8-5-5-5 5\", key: \"7q97r8\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }]\n];\nconst Upload = createLucideIcon(\"upload\", __iconNode);\n\nexport { __iconNode, Upload as default };\n//# sourceMappingURL=upload.js.map\n","import { useState, useEffect, useRef, useCallback } from \"react\";\nimport {\n ChevronRight,\n ChevronDown,\n File,\n Folder,\n FolderOpen,\n X,\n GitBranch,\n GitCommit as GitCommitIcon,\n GitPullRequest,\n Plus,\n Minus,\n Check,\n Upload,\n Download,\n RefreshCw,\n Terminal as TerminalIcon,\n MessageSquare,\n Send,\n Loader2,\n Circle,\n FileCode,\n FileText,\n FolderTree,\n ArrowUp,\n ArrowDown,\n Search,\n MoreHorizontal,\n Copy,\n Eye,\n Zap,\n Play,\n Sparkles,\n FolderInput,\n Maximize2,\n Minimize2,\n} from \"lucide-react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport { cn } from \"@/lib/utils\";\nimport { Button } from \"@/components/ui/button\";\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\nimport { Badge } from \"@/components/ui/badge\";\nimport api from \"@/lib/api\";\nimport type {\n WorkspaceTree,\n WorkspaceFile,\n WorkspaceInfo,\n GitStatus,\n GitFile,\n GitBranch as GitBranchType,\n GitCommit,\n TerminalResult,\n} from \"@/lib/api\";\nimport { useChatStore } from \"@/stores/chat\";\nimport { useSSE } from \"@/hooks/useSSE\";\nimport { MarkdownRenderer } from \"@/components/chat/MarkdownRenderer\";\nimport { Prism as SyntaxHighlighter } from \"react-syntax-highlighter\";\nimport { oneDark } from \"react-syntax-highlighter/dist/esm/styles/prism\";\n\n// ═══════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════\n\ninterface OpenTab {\n path: string;\n name: string;\n content: string;\n language: string;\n dirty: boolean;\n originalContent: string;\n}\n\ninterface TerminalEntry {\n id: string;\n command: string;\n output: string;\n exitCode: number;\n timestamp: number;\n}\n\n// ═══════════════════════════════════════════════════════════════\n// Utilities\n// ═══════════════════════════════════════════════════════════════\n\nfunction extToLanguage(ext: string): string {\n const map: Record<string, string> = {\n \".ts\": \"typescript\", \".tsx\": \"tsx\", \".js\": \"javascript\", \".jsx\": \"jsx\",\n \".py\": \"python\", \".rs\": \"rust\", \".go\": \"go\", \".java\": \"java\",\n \".json\": \"json\", \".yaml\": \"yaml\", \".yml\": \"yaml\", \".toml\": \"toml\",\n \".md\": \"markdown\", \".txt\": \"text\", \".css\": \"css\", \".html\": \"html\",\n \".sh\": \"bash\", \".bash\": \"bash\", \".zsh\": \"bash\", \".sql\": \"sql\",\n \".xml\": \"xml\", \".svg\": \"xml\", \".dockerfile\": \"docker\",\n \".env\": \"text\", \".gitignore\": \"text\", \".c\": \"c\", \".cpp\": \"cpp\",\n \".h\": \"c\", \".hpp\": \"cpp\", \".rb\": \"ruby\", \".php\": \"php\",\n \".swift\": \"swift\", \".kt\": \"kotlin\", \".scala\": \"scala\",\n \".lua\": \"lua\", \".r\": \"r\", \".dart\": \"dart\", \".graphql\": \"graphql\",\n \".scss\": \"scss\", \".less\": \"less\", \".vue\": \"markup\",\n \".prisma\": \"text\", \".proto\": \"protobuf\",\n };\n return map[ext.toLowerCase()] || \"text\";\n}\n\nfunction fileIcon(name: string, isDir: boolean, isOpen?: boolean) {\n if (isDir) {\n return isOpen\n ? <FolderOpen className=\"h-4 w-4 text-mercury-400\" />\n : <Folder className=\"h-4 w-4 text-mercury-400/70\" />;\n }\n const ext = name.includes(\".\") ? \".\" + name.split(\".\").pop()! : \"\";\n const codeExts = [\".ts\", \".tsx\", \".js\", \".jsx\", \".py\", \".rs\", \".go\", \".java\", \".sh\"];\n if (codeExts.includes(ext)) return <FileCode className=\"h-4 w-4 text-blue-400\" />;\n return <FileText className=\"h-4 w-4 text-muted-foreground\" />;\n}\n\nfunction statusColor(status: string): string {\n switch (status) {\n case \"modified\": return \"text-amber-400\";\n case \"added\": return \"text-emerald-400\";\n case \"deleted\": return \"text-red-400\";\n case \"untracked\": return \"text-gray-400\";\n case \"renamed\": return \"text-purple-400\";\n default: return \"text-muted-foreground\";\n }\n}\n\nfunction statusIcon(status: string) {\n switch (status) {\n case \"modified\": return <span className=\"text-amber-400 text-xs font-bold\">M</span>;\n case \"added\": return <span className=\"text-emerald-400 text-xs font-bold\">A</span>;\n case \"deleted\": return <span className=\"text-red-400 text-xs font-bold\">D</span>;\n case \"untracked\": return <span className=\"text-gray-400 text-xs font-bold\">U</span>;\n case \"renamed\": return <span className=\"text-purple-400 text-xs font-bold\">R</span>;\n default: return <span className=\"text-muted-foreground text-xs\">?</span>;\n }\n}\n\n// ═══════════════════════════════════════════════════════════════\n// File Explorer Panel (Left)\n// ═══════════════════════════════════════════════════════════════\n\nfunction FileExplorer({\n onOpenFile,\n openFiles,\n}: {\n onOpenFile: (path: string) => void;\n openFiles: string[];\n}) {\n const [tree, setTree] = useState<WorkspaceTree | null>(null);\n const [expandedDirs, setExpandedDirs] = useState<Set<string>>(new Set([\".\"]));\n const [dirContents, setDirContents] = useState<Map<string, WorkspaceTree>>(new Map());\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n loadDir();\n }, []);\n\n async function loadDir(path?: string) {\n try {\n const data = await api.workspace.tree(path);\n if (!path || path === \".\") {\n setTree(data);\n setLoading(false);\n } else {\n setDirContents((prev) => new Map(prev).set(path, data));\n }\n } catch {\n setLoading(false);\n }\n }\n\n function toggleDir(path: string) {\n const next = new Set(expandedDirs);\n if (next.has(path)) {\n next.delete(path);\n } else {\n next.add(path);\n if (!dirContents.has(path)) {\n loadDir(path);\n }\n }\n setExpandedDirs(next);\n }\n\n function renderItems(items: WorkspaceTree[\"items\"], parentPath: string) {\n return items.map((item) => {\n const fullPath = parentPath === \".\" ? item.name : `${parentPath}/${item.name}`;\n const isExpanded = expandedDirs.has(fullPath);\n const isOpen = openFiles.includes(fullPath);\n\n if (item.isDirectory) {\n const subTree = dirContents.get(fullPath);\n return (\n <div key={fullPath}>\n <button\n onClick={() => toggleDir(fullPath)}\n className={cn(\n \"flex w-full items-center gap-1.5 rounded-md px-2 py-1 text-left text-[13px] transition-colors\",\n \"hover:bg-muted/60\"\n )}\n >\n {isExpanded\n ? <ChevronDown className=\"h-3 w-3 shrink-0 text-muted-foreground\" />\n : <ChevronRight className=\"h-3 w-3 shrink-0 text-muted-foreground\" />\n }\n {fileIcon(item.name, true, isExpanded)}\n <span className=\"truncate\">{item.name}</span>\n </button>\n {isExpanded && subTree && (\n <div className=\"ml-3 border-l border-border/30 pl-1\">\n {renderItems(subTree.items, fullPath)}\n </div>\n )}\n </div>\n );\n }\n\n return (\n <button\n key={fullPath}\n onClick={() => onOpenFile(fullPath)}\n className={cn(\n \"flex w-full items-center gap-1.5 rounded-md px-2 py-1 text-left text-[13px] transition-colors\",\n isOpen\n ? \"bg-primary/10 text-primary\"\n : \"hover:bg-muted/60 text-foreground/80\"\n )}\n >\n <span className=\"w-3\" />\n {fileIcon(item.name, false)}\n <span className=\"truncate\">{item.name}</span>\n </button>\n );\n });\n }\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 className=\"h-5 w-5 animate-spin text-primary\" />\n </div>\n );\n }\n\n return (\n <div className=\"flex h-full flex-col\">\n <div className=\"flex items-center justify-between border-b border-border px-3 py-2\">\n <div className=\"flex items-center gap-1.5\">\n <FolderTree className=\"h-4 w-4 text-mercury-400\" />\n <span className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Explorer\n </span>\n </div>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6\" onClick={() => loadDir()}>\n <RefreshCw className=\"h-3 w-3\" />\n </Button>\n </div>\n <ScrollArea className=\"flex-1 px-1 py-1\">\n {tree && renderItems(tree.items, \".\")}\n </ScrollArea>\n </div>\n );\n}\n\n// ═══════════════════════════════════════════════════════════════\n// Editor Tabs Panel (Center)\n// ═══════════════════════════════════════════════════════════════\n\nfunction EditorPanel({\n tabs,\n activeTab,\n onSelectTab,\n onCloseTab,\n onSave,\n onContentChange,\n}: {\n tabs: OpenTab[];\n activeTab: string | null;\n onSelectTab: (path: string) => void;\n onCloseTab: (path: string) => void;\n onSave: (path: string) => void;\n onContentChange: (path: string, content: string) => void;\n}) {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const scrollRef = useRef<HTMLDivElement>(null);\n const current = tabs.find((t) => t.path === activeTab);\n\n // Handle keyboard shortcuts\n useEffect(() => {\n function handleKey(e: KeyboardEvent) {\n if ((e.metaKey || e.ctrlKey) && e.key === \"s\") {\n e.preventDefault();\n if (activeTab) onSave(activeTab);\n }\n }\n window.addEventListener(\"keydown\", handleKey);\n return () => window.removeEventListener(\"keydown\", handleKey);\n }, [activeTab, onSave]);\n\n if (tabs.length === 0) {\n return (\n <div className=\"flex h-full flex-col items-center justify-center gap-4 text-center\">\n <div className=\"rounded-2xl bg-primary/10 p-6\">\n <FileCode className=\"h-12 w-12 text-primary/60\" />\n </div>\n <div>\n <h3 className=\"text-base font-semibold text-foreground\">No files open</h3>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Select a file from the explorer to start editing\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex h-full flex-col\">\n {/* Tab bar */}\n <div className=\"flex items-center gap-0 overflow-x-auto border-b border-border bg-muted/20\">\n {tabs.map((tab) => (\n <button\n key={tab.path}\n onClick={() => onSelectTab(tab.path)}\n className={cn(\n \"group flex items-center gap-2 border-r border-border/30 px-3 py-1.5 text-[13px] transition-colors\",\n tab.path === activeTab\n ? \"bg-background text-foreground border-b-2 border-b-primary\"\n : \"text-muted-foreground hover:bg-muted/40 hover:text-foreground\"\n )}\n >\n {fileIcon(tab.name, false)}\n <span className=\"max-w-[120px] truncate\">{tab.name}</span>\n {tab.dirty && (\n <Circle className=\"h-2 w-2 fill-primary text-primary\" />\n )}\n <button\n onClick={(e) => { e.stopPropagation(); onCloseTab(tab.path); }}\n className=\"ml-1 rounded p-0.5 opacity-0 transition-opacity group-hover:opacity-100 hover:bg-muted\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </button>\n ))}\n </div>\n\n {/* Editor area */}\n {current && (\n <div className=\"relative flex flex-col flex-1 min-h-0\">\n {/* Info bar */}\n <div className=\"flex items-center justify-between border-b border-border/30 bg-muted/10 px-3 py-1\">\n <span className=\"text-xs text-muted-foreground font-mono\">{current.path}</span>\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"text-[10px] px-1.5 py-0\">\n {current.language}\n </Badge>\n {current.dirty && (\n <Button size=\"sm\" variant=\"ghost\" className=\"h-5 gap-1 px-2 text-[10px]\" onClick={() => onSave(current.path)}>\n <span className=\"text-primary\">Save</span>\n <span className=\"text-muted-foreground\">Cmd+S</span>\n </Button>\n )}\n </div>\n </div>\n\n {/* Code content — syntax highlighted with editable overlay */}\n <div className=\"flex-1 min-h-0 overflow-auto bg-[#282c34]\" ref={scrollRef} onClick={() => textareaRef.current?.focus()}>\n <div className=\"relative\" style={{ minWidth: \"fit-content\" }}>\n {/* Syntax highlighted layer (visual) */}\n <SyntaxHighlighter\n language={current.language}\n style={oneDark}\n showLineNumbers\n lineNumberStyle={{\n minWidth: \"3em\",\n paddingRight: \"1em\",\n color: \"rgba(255,255,255,0.25)\",\n fontSize: \"13px\",\n lineHeight: \"20px\",\n userSelect: \"none\",\n }}\n customStyle={{\n margin: 0,\n padding: \"0.5rem 0\",\n background: \"transparent\",\n fontSize: \"13px\",\n lineHeight: \"20px\",\n fontFamily: \"var(--font-mono, 'Geist Mono', ui-monospace, monospace)\",\n }}\n codeTagProps={{\n style: {\n fontSize: \"13px\",\n lineHeight: \"20px\",\n fontFamily: \"var(--font-mono, 'Geist Mono', ui-monospace, monospace)\",\n },\n }}\n wrapLongLines={false}\n >\n {current.content || \" \"}\n </SyntaxHighlighter>\n {/* Transparent textarea overlay for editing */}\n <textarea\n ref={textareaRef}\n value={current.content}\n onChange={(e) => onContentChange(current.path, e.target.value)}\n spellCheck={false}\n className={cn(\n \"absolute top-0 left-0 w-full h-full resize-none bg-transparent text-transparent caret-white\",\n \"font-mono text-[13px] leading-[20px]\",\n \"focus:outline-none\",\n \"whitespace-pre\",\n \"pointer-events-none focus:pointer-events-auto\"\n )}\n style={{\n tabSize: 2,\n padding: \"0.5rem 0 0.5rem 4.5em\",\n fontFamily: \"var(--font-mono, 'Geist Mono', ui-monospace, monospace)\",\n overflow: \"hidden\",\n }}\n onFocus={() => {\n // Enable pointer events while editing\n if (textareaRef.current) {\n textareaRef.current.style.pointerEvents = \"auto\";\n }\n }}\n onBlur={() => {\n // Disable pointer events when not editing so scroll passes through\n if (textareaRef.current) {\n textareaRef.current.style.pointerEvents = \"none\";\n }\n }}\n onWheel={(e) => {\n // Forward wheel events to parent scroll container while focused\n if (scrollRef.current) {\n scrollRef.current.scrollTop += e.deltaY;\n scrollRef.current.scrollLeft += e.deltaX;\n }\n }}\n />\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\n// ═══════════════════════════════════════════════════════════════\n// Git Panel (Right)\n// ═══════════════════════════════════════════════════════════════\n\nfunction GitPanel() {\n const [gitStatus, setGitStatus] = useState<GitStatus | null>(null);\n const [branches, setBranches] = useState<GitBranchType[]>([]);\n const [commits, setCommits] = useState<GitCommit[]>([]);\n const [commitMsg, setCommitMsg] = useState(\"\");\n const [showBranches, setShowBranches] = useState(false);\n const [showLog, setShowLog] = useState(false);\n const [loading, setLoading] = useState(true);\n const [refreshing, setRefreshing] = useState(false);\n const [actionLoading, setActionLoading] = useState<string | null>(null);\n const [feedback, setFeedback] = useState<{ type: \"success\" | \"error\"; msg: string } | null>(null);\n\n const refresh = useCallback(async (showToast: boolean = false) => {\n setRefreshing(true);\n try {\n const [statusData, branchData, logData] = await Promise.all([\n api.git.status(),\n api.git.branches(),\n api.git.log(15),\n ]);\n setGitStatus(statusData);\n setBranches(branchData.branches);\n setCommits(logData.commits);\n if (showToast) {\n setFeedback({ type: \"success\", msg: \"Refreshed\" });\n setTimeout(() => setFeedback(null), 1500);\n }\n } catch (err: any) {\n setFeedback({ type: \"error\", msg: err.message });\n } finally {\n setLoading(false);\n setRefreshing(false);\n }\n }, []);\n\n useEffect(() => { refresh(); }, [refresh]);\n\n function showFeedbackMsg(type: \"success\" | \"error\", msg: string) {\n setFeedback({ type, msg });\n setTimeout(() => setFeedback(null), 3000);\n }\n\n async function handleStage(files: string[]) {\n setActionLoading(\"stage\");\n try {\n await api.git.stage(files);\n await refresh();\n } catch (err: any) {\n showFeedbackMsg(\"error\", err.message);\n } finally {\n setActionLoading(null);\n }\n }\n\n async function handleUnstage(files: string[]) {\n setActionLoading(\"unstage\");\n try {\n await api.git.unstage(files);\n await refresh();\n } catch (err: any) {\n showFeedbackMsg(\"error\", err.message);\n } finally {\n setActionLoading(null);\n }\n }\n\n async function handleCommit() {\n if (!commitMsg.trim()) return;\n setActionLoading(\"commit\");\n try {\n const result = await api.git.commit(commitMsg.trim());\n setCommitMsg(\"\");\n showFeedbackMsg(\"success\", \"Committed successfully\");\n await refresh();\n } catch (err: any) {\n showFeedbackMsg(\"error\", err.message);\n } finally {\n setActionLoading(null);\n }\n }\n\n async function handlePush() {\n setActionLoading(\"push\");\n try {\n const result = await api.git.push();\n showFeedbackMsg(\"success\", result.message || \"Pushed\");\n await refresh();\n } catch (err: any) {\n showFeedbackMsg(\"error\", err.message);\n } finally {\n setActionLoading(null);\n }\n }\n\n async function handlePull() {\n setActionLoading(\"pull\");\n try {\n const result = await api.git.pull();\n showFeedbackMsg(\"success\", result.message || \"Pulled\");\n await refresh();\n } catch (err: any) {\n showFeedbackMsg(\"error\", err.message);\n } finally {\n setActionLoading(null);\n }\n }\n\n async function handleCheckout(branch: string) {\n setActionLoading(\"checkout\");\n try {\n await api.git.checkout(branch);\n showFeedbackMsg(\"success\", `Switched to ${branch}`);\n setShowBranches(false);\n await refresh();\n } catch (err: any) {\n showFeedbackMsg(\"error\", err.message);\n } finally {\n setActionLoading(null);\n }\n }\n\n async function handleGenerateMessage() {\n setActionLoading(\"generate\");\n try {\n // Auto-stage all unstaged files first\n const unstaged = gitStatus?.files.filter((f) => !f.staged) || [];\n if (unstaged.length > 0) {\n await api.git.stage([\".\"]);\n await refresh();\n }\n const result = await api.git.generateCommitMessage();\n const msg = typeof result === \"string\" ? result : result?.message || \"\";\n if (msg) {\n setCommitMsg(msg);\n showFeedbackMsg(\"success\", \"Message generated\");\n } else {\n showFeedbackMsg(\"error\", \"No message returned\");\n }\n } catch (err: any) {\n showFeedbackMsg(\"error\", err.message);\n } finally {\n setActionLoading(null);\n }\n }\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 className=\"h-5 w-5 animate-spin text-primary\" />\n </div>\n );\n }\n\n const stagedFiles = gitStatus?.files.filter((f) => f.staged) || [];\n const unstagedFiles = gitStatus?.files.filter((f) => !f.staged) || [];\n\n return (\n <div className=\"flex h-full flex-col\">\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-border px-3 py-2\">\n <div className=\"flex items-center gap-1.5\">\n <GitBranch className=\"h-4 w-4 text-mercury-400\" />\n <span className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Source Control\n </span>\n </div>\n <div className=\"flex items-center gap-1\">\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6\" onClick={handlePull} disabled={!!actionLoading}>\n <Download className=\"h-3 w-3\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6\" onClick={handlePush} disabled={!!actionLoading}>\n <Upload className=\"h-3 w-3\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={() => refresh(true)}\n disabled={!!actionLoading || refreshing}\n title=\"Refresh\"\n aria-label=\"Refresh\"\n >\n <RefreshCw className={cn(\"h-3 w-3\", refreshing && \"animate-spin\")} />\n </Button>\n </div>\n </div>\n\n <ScrollArea className=\"flex-1\">\n <div className=\"p-2 space-y-3\">\n {/* Feedback */}\n <AnimatePresence>\n {feedback && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n className={cn(\n \"rounded-md px-3 py-1.5 text-xs\",\n feedback.type === \"success\"\n ? \"bg-emerald-500/10 text-emerald-400 border border-emerald-500/20\"\n : \"bg-red-500/10 text-red-400 border border-red-500/20\"\n )}\n >\n {feedback.msg}\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Branch info */}\n <div className=\"space-y-1\">\n <button\n onClick={() => setShowBranches(!showBranches)}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors hover:bg-muted/60\"\n >\n <GitBranch className=\"h-3.5 w-3.5 text-primary\" />\n <span className=\"font-medium\">{gitStatus?.branch || \"—\"}</span>\n {gitStatus && gitStatus.ahead > 0 && (\n <Badge variant=\"outline\" className=\"text-[10px] px-1 py-0\">\n <ArrowUp className=\"h-2.5 w-2.5 mr-0.5\" />{gitStatus.ahead}\n </Badge>\n )}\n {gitStatus && gitStatus.behind > 0 && (\n <Badge variant=\"outline\" className=\"text-[10px] px-1 py-0\">\n <ArrowDown className=\"h-2.5 w-2.5 mr-0.5\" />{gitStatus.behind}\n </Badge>\n )}\n <ChevronRight className={cn(\"ml-auto h-3 w-3 transition-transform\", showBranches && \"rotate-90\")} />\n </button>\n\n {/* Branch picker */}\n <AnimatePresence>\n {showBranches && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n className=\"overflow-hidden\"\n >\n <div className=\"ml-2 space-y-0.5 border-l border-border/30 pl-2 py-1\">\n {branches.filter((b) => !b.name.startsWith(\"remotes/\")).map((b) => (\n <button\n key={b.name}\n onClick={() => !b.isCurrent && handleCheckout(b.name)}\n className={cn(\n \"flex w-full items-center gap-2 rounded-md px-2 py-1 text-xs transition-colors\",\n b.isCurrent\n ? \"bg-primary/10 text-primary\"\n : \"text-muted-foreground hover:bg-muted/60 hover:text-foreground\"\n )}\n disabled={b.isCurrent || !!actionLoading}\n >\n {b.isCurrent && <Check className=\"h-3 w-3\" />}\n <span className=\"truncate\">{b.name}</span>\n </button>\n ))}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n\n {/* Commit input */}\n <div className=\"space-y-1.5\">\n <div className=\"relative\">\n <textarea\n value={commitMsg}\n onChange={(e) => setCommitMsg(e.target.value)}\n placeholder=\"Commit message...\"\n rows={2}\n className={cn(\n \"w-full resize-none rounded-lg border border-border bg-muted/30 px-3 py-2 pr-9 text-sm text-foreground\",\n \"placeholder:text-muted-foreground/60 focus:outline-none focus:ring-1 focus:ring-primary/40\"\n )}\n />\n {/* Generate button inside textarea */}\n <button\n onClick={handleGenerateMessage}\n disabled={!!actionLoading}\n title=\"AI generate commit message\"\n className={cn(\n \"absolute right-2 top-2 rounded-md p-1.5 transition-colors border border-border/50\",\n \"text-primary/70 hover:text-primary hover:bg-primary/10 bg-background/80\",\n actionLoading === \"generate\" && \"animate-pulse\"\n )}\n >\n {actionLoading === \"generate\"\n ? <Loader2 className=\"h-4 w-4 animate-spin text-primary\" />\n : <Sparkles className=\"h-4 w-4\" />\n }\n </button>\n </div>\n <Button\n size=\"sm\"\n className=\"w-full h-7 gap-1.5 text-xs\"\n disabled={!commitMsg.trim() || stagedFiles.length === 0 || !!actionLoading}\n onClick={handleCommit}\n >\n {actionLoading === \"commit\"\n ? <Loader2 className=\"h-3 w-3 animate-spin\" />\n : <Check className=\"h-3 w-3\" />\n }\n Commit ({stagedFiles.length} staged)\n </Button>\n </div>\n\n {/* Staged Changes */}\n {stagedFiles.length > 0 && (\n <div>\n <div className=\"flex items-center justify-between px-1 mb-1\">\n <span className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider\">\n Staged ({stagedFiles.length})\n </span>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-5 w-5\" onClick={() => handleUnstage(stagedFiles.map((f) => f.path))}>\n <Minus className=\"h-3 w-3\" />\n </Button>\n </div>\n <div className=\"space-y-0.5\">\n {stagedFiles.map((f) => (\n <div\n key={`staged-${f.path}`}\n className=\"flex items-center gap-2 rounded-md px-2 py-1 text-xs hover:bg-muted/40 group\"\n >\n {statusIcon(f.status)}\n <span className=\"flex-1 truncate font-mono\">{f.path}</span>\n <button\n onClick={() => handleUnstage([f.path])}\n className=\"opacity-0 group-hover:opacity-100 transition-opacity\"\n >\n <Minus className=\"h-3 w-3 text-muted-foreground hover:text-foreground\" />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Unstaged Changes */}\n {unstagedFiles.length > 0 && (\n <div>\n <div className=\"flex items-center justify-between px-1 mb-1\">\n <span className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider\">\n Changes ({unstagedFiles.length})\n </span>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-5 w-5\" onClick={() => handleStage(unstagedFiles.map((f) => f.path))}>\n <Plus className=\"h-3 w-3\" />\n </Button>\n </div>\n <div className=\"space-y-0.5\">\n {unstagedFiles.map((f) => (\n <div\n key={`unstaged-${f.path}`}\n className=\"flex items-center gap-2 rounded-md px-2 py-1 text-xs hover:bg-muted/40 group\"\n >\n {statusIcon(f.status)}\n <span className=\"flex-1 truncate font-mono\">{f.path}</span>\n <button\n onClick={() => handleStage([f.path])}\n className=\"opacity-0 group-hover:opacity-100 transition-opacity\"\n >\n <Plus className=\"h-3 w-3 text-muted-foreground hover:text-foreground\" />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {stagedFiles.length === 0 && unstagedFiles.length === 0 && (\n <div className=\"py-4 text-center text-xs text-muted-foreground\">\n No changes detected\n </div>\n )}\n\n {/* Recent Commits */}\n <div>\n <button\n onClick={() => setShowLog(!showLog)}\n className=\"flex w-full items-center gap-1.5 px-1 mb-1\"\n >\n <ChevronRight className={cn(\"h-3 w-3 text-muted-foreground transition-transform\", showLog && \"rotate-90\")} />\n <span className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider\">\n Recent Commits\n </span>\n </button>\n <AnimatePresence>\n {showLog && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n className=\"overflow-hidden\"\n >\n <div className=\"space-y-0.5\">\n {commits.map((commit) => (\n <div\n key={commit.hash}\n className=\"rounded-md px-2 py-1.5 hover:bg-muted/40 transition-colors\"\n >\n <div className=\"flex items-start gap-2\">\n <GitCommitIcon className=\"h-3 w-3 mt-0.5 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-xs text-foreground line-clamp-2 leading-snug\">\n {commit.message}\n </p>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n <span className=\"font-mono\">{commit.short}</span>\n <span className=\"mx-1\">·</span>\n {commit.date}\n </p>\n </div>\n </div>\n </div>\n ))}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </div>\n </ScrollArea>\n </div>\n );\n}\n\n// ═══════════════════════════════════════════════════════════════\n// Bottom Panel — Terminal + Chat Input\n// ═══════════════════════════════════════════════════════════════\n\nfunction BottomPanel({\n projectInfo,\n codeMode,\n isMaximized,\n onToggleMaximize,\n}: {\n projectInfo: WorkspaceInfo | null;\n codeMode: { state: string; active: boolean } | null;\n isMaximized: boolean;\n onToggleMaximize: () => void;\n}) {\n const [activeBottomTab, setActiveBottomTab] = useState<\"terminal\" | \"chat\">(\"terminal\");\n const [terminalHistory, setTerminalHistory] = useState<TerminalEntry[]>([]);\n const [terminalInput, setTerminalInput] = useState(\"\");\n const [terminalLoading, setTerminalLoading] = useState(false);\n const [cmdHistory, setCmdHistory] = useState<string[]>([]);\n const [cmdHistoryIdx, setCmdHistoryIdx] = useState(-1);\n const terminalRef = useRef<HTMLDivElement>(null);\n const termInputRef = useRef<HTMLInputElement>(null);\n\n // Chat state\n const [chatInput, setChatInput] = useState(\"\");\n const { connected } = useSSE();\n const streamingText = useChatStore((s) => s.streamingText);\n const isStreaming = useChatStore((s) => s.isStreaming);\n const waiting = useChatStore((s) => s.waiting);\n const messages = useChatStore((s) => s.messages);\n const addMessage = useChatStore((s) => s.addMessage);\n const setWaiting = useChatStore((s) => s.setWaiting);\n const clearStreaming = useChatStore((s) => s.clearStreaming);\n const activeThreadId = useChatStore((s) => s.activeThreadId);\n const setActiveThread = useChatStore((s) => s.setActiveThread);\n const bumpThreadVersion = useChatStore((s) => s.bumpThreadVersion);\n\n const isBusy = isStreaming || waiting;\n\n // Scroll terminal to bottom\n useEffect(() => {\n if (terminalRef.current) {\n terminalRef.current.scrollTop = terminalRef.current.scrollHeight;\n }\n }, [terminalHistory]);\n\n async function handleTerminalExec() {\n const cmd = terminalInput.trim();\n if (!cmd || terminalLoading) return;\n setTerminalInput(\"\");\n setCmdHistory((prev) => [...prev, cmd]);\n setCmdHistoryIdx(-1);\n setTerminalLoading(true);\n\n try {\n const result = await api.terminal.exec(cmd);\n setTerminalHistory((prev) => [\n ...prev,\n {\n id: `${Date.now()}`,\n command: cmd,\n output: result.output || result.error || \"\",\n exitCode: result.exitCode,\n timestamp: Date.now(),\n },\n ]);\n } catch (err: any) {\n setTerminalHistory((prev) => [\n ...prev,\n {\n id: `${Date.now()}`,\n command: cmd,\n output: err.message,\n exitCode: 1,\n timestamp: Date.now(),\n },\n ]);\n } finally {\n setTerminalLoading(false);\n termInputRef.current?.focus();\n }\n }\n\n function handleTerminalKeyDown(e: React.KeyboardEvent) {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleTerminalExec();\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n if (cmdHistory.length > 0) {\n const newIdx = cmdHistoryIdx < 0 ? cmdHistory.length - 1 : Math.max(0, cmdHistoryIdx - 1);\n setCmdHistoryIdx(newIdx);\n setTerminalInput(cmdHistory[newIdx]);\n }\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n if (cmdHistoryIdx >= 0) {\n const newIdx = cmdHistoryIdx + 1;\n if (newIdx >= cmdHistory.length) {\n setCmdHistoryIdx(-1);\n setTerminalInput(\"\");\n } else {\n setCmdHistoryIdx(newIdx);\n setTerminalInput(cmdHistory[newIdx]);\n }\n }\n }\n }\n\n async function handleChatSend() {\n const content = chatInput.trim();\n if (!content || isBusy) return;\n setChatInput(\"\");\n\n let threadId = activeThreadId;\n if (!threadId) {\n threadId = `web:${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n setActiveThread(threadId);\n }\n\n addMessage({\n id: crypto.randomUUID(),\n role: \"user\",\n content,\n timestamp: new Date().toISOString(),\n });\n setWaiting(true);\n\n api.chat.threads.addMessage(threadId, \"user\", content)\n .then(() => bumpThreadVersion())\n .catch(() => {});\n\n try {\n await api.chat.send(content, threadId);\n } catch {\n setWaiting(false);\n clearStreaming();\n }\n }\n\n // Get last few messages for the chat feed\n const recentMessages = messages.slice(-6);\n\n return (\n <div className=\"flex h-full flex-col\">\n {/* Status bar */}\n <div className=\"flex items-center gap-2 border-b border-border bg-muted/20 px-3 py-1 text-[11px]\">\n {/* Mode indicator */}\n <div className=\"flex items-center gap-1.5\">\n {codeMode?.active ? (\n <Badge\n variant=\"outline\"\n className={cn(\n \"text-[10px] px-1.5 py-0 gap-1\",\n codeMode.state === \"execute\"\n ? \"border-emerald-500/40 text-emerald-400\"\n : \"border-amber-500/40 text-amber-400\"\n )}\n >\n <Zap className=\"h-2.5 w-2.5\" />\n {codeMode.state === \"execute\" ? \"Execute\" : \"Plan\"}\n </Badge>\n ) : (\n <Badge variant=\"outline\" className=\"text-[10px] px-1.5 py-0 text-muted-foreground\">\n Chat\n </Badge>\n )}\n </div>\n\n <span className=\"h-3 w-px bg-border\" />\n\n {/* Project info */}\n {projectInfo && (\n <>\n <span className=\"text-muted-foreground font-mono truncate max-w-[200px]\">\n {projectInfo.projectName}\n </span>\n <span className=\"h-3 w-px bg-border\" />\n <span className=\"text-muted-foreground font-mono truncate max-w-[300px]\" title={projectInfo.cwd}>\n {projectInfo.cwd}\n </span>\n {projectInfo.isGit && (\n <>\n <span className=\"h-3 w-px bg-border\" />\n <div className=\"flex items-center gap-1 text-muted-foreground\">\n <GitBranch className=\"h-3 w-3\" />\n <span className=\"font-mono\">{projectInfo.branch}</span>\n </div>\n </>\n )}\n </>\n )}\n\n <span className=\"flex-1\" />\n\n {/* Connection indicator */}\n <div className=\"flex items-center gap-1 text-muted-foreground\">\n <div className={cn(\"h-1.5 w-1.5 rounded-full\", connected ? \"bg-emerald-500\" : \"bg-red-500\")} />\n <span>{connected ? \"Connected\" : \"Disconnected\"}</span>\n </div>\n </div>\n\n {/* Tab headers */}\n <div className=\"flex items-center justify-between border-b border-border bg-muted/10\">\n <div className=\"flex items-center\">\n <button\n onClick={() => setActiveBottomTab(\"terminal\")}\n className={cn(\n \"flex items-center gap-1.5 px-4 py-1.5 text-xs font-medium transition-colors border-b-2\",\n activeBottomTab === \"terminal\"\n ? \"border-b-primary text-foreground\"\n : \"border-b-transparent text-muted-foreground hover:text-foreground\"\n )}\n >\n <TerminalIcon className=\"h-3.5 w-3.5\" />\n Terminal\n </button>\n <button\n onClick={() => setActiveBottomTab(\"chat\")}\n className={cn(\n \"flex items-center gap-1.5 px-4 py-1.5 text-xs font-medium transition-colors border-b-2\",\n activeBottomTab === \"chat\"\n ? \"border-b-primary text-foreground\"\n : \"border-b-transparent text-muted-foreground hover:text-foreground\"\n )}\n >\n <MessageSquare className=\"h-3.5 w-3.5\" />\n Chat\n {isBusy && <Loader2 className=\"h-3 w-3 animate-spin text-primary\" />}\n </button>\n </div>\n <button\n onClick={onToggleMaximize}\n className=\"mr-2 rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground\"\n title={isMaximized ? \"Restore panel\" : \"Maximize panel\"}\n aria-label={isMaximized ? \"Restore panel\" : \"Maximize panel\"}\n >\n {isMaximized ? (\n <Minimize2 className=\"h-3.5 w-3.5\" />\n ) : (\n <Maximize2 className=\"h-3.5 w-3.5\" />\n )}\n </button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-h-0 overflow-hidden\">\n {activeBottomTab === \"terminal\" ? (\n <div className=\"flex h-full flex-col bg-[#0d1117]\">\n <div ref={terminalRef} className=\"flex-1 overflow-auto p-2 font-mono text-[13px]\">\n {terminalHistory.map((entry) => (\n <div key={entry.id} className=\"mb-2\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-emerald-400\">$</span>\n <span className=\"text-gray-200\">{entry.command}</span>\n </div>\n {entry.output && (\n <pre className={cn(\n \"whitespace-pre-wrap text-[12px] leading-relaxed mt-0.5 pl-4\",\n entry.exitCode === 0 ? \"text-gray-400\" : \"text-red-400\"\n )}>\n {entry.output}\n </pre>\n )}\n </div>\n ))}\n {terminalLoading && (\n <div className=\"flex items-center gap-2 text-gray-500\">\n <Loader2 className=\"h-3 w-3 animate-spin\" />\n <span className=\"text-xs\">Running...</span>\n </div>\n )}\n </div>\n\n {/* Terminal input */}\n <div className=\"flex items-center gap-2 border-t border-gray-800 bg-[#0d1117] px-3 py-2\">\n <span className=\"text-emerald-400 font-mono text-sm\">$</span>\n <input\n ref={termInputRef}\n value={terminalInput}\n onChange={(e) => setTerminalInput(e.target.value)}\n onKeyDown={handleTerminalKeyDown}\n placeholder=\"Type a command...\"\n className=\"flex-1 bg-transparent font-mono text-[13px] text-gray-200 placeholder:text-gray-600 focus:outline-none\"\n autoFocus\n />\n </div>\n </div>\n ) : (\n <div className=\"flex h-full flex-col\">\n {/* Chat messages feed */}\n <ScrollArea className=\"flex-1 px-3 py-2\">\n <div className=\"space-y-2\">\n {recentMessages.map((msg) => (\n <div\n key={msg.id}\n className={cn(\n \"rounded-lg px-3 py-2 text-sm\",\n msg.role === \"user\"\n ? \"bg-primary/10 text-foreground ml-8\"\n : msg.role === \"system\"\n ? \"bg-red-500/10 text-red-400\"\n : \"bg-muted text-foreground mr-8\"\n )}\n >\n {msg.role === \"assistant\" ? (\n <MarkdownRenderer content={msg.content} />\n ) : (\n <p className=\"whitespace-pre-wrap text-[13px]\">{msg.content}</p>\n )}\n </div>\n ))}\n {isStreaming && streamingText && (\n <div className=\"rounded-lg bg-muted px-3 py-2 mr-8\">\n <MarkdownRenderer content={streamingText} />\n <span className=\"inline-block h-3.5 w-[2px] animate-pulse bg-primary ml-0.5\" />\n </div>\n )}\n {waiting && !isStreaming && (\n <div className=\"flex items-center gap-2 rounded-lg bg-muted px-3 py-2 text-sm text-muted-foreground mr-8\">\n <Loader2 className=\"h-3.5 w-3.5 animate-spin text-primary\" />\n Thinking...\n </div>\n )}\n </div>\n </ScrollArea>\n\n {/* Chat input */}\n <div className=\"flex items-center gap-2 border-t border-border px-3 py-2\">\n <input\n value={chatInput}\n onChange={(e) => setChatInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleChatSend();\n }\n }}\n placeholder=\"Ask Mercury...\"\n disabled={isBusy}\n className={cn(\n \"flex-1 bg-transparent text-sm text-foreground placeholder:text-muted-foreground/60 focus:outline-none\",\n isBusy && \"opacity-50\"\n )}\n />\n <Button\n size=\"icon\"\n className=\"h-7 w-7 shrink-0\"\n disabled={isBusy || !chatInput.trim()}\n onClick={handleChatSend}\n >\n <Send className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n\n// ═══════════════════════════════════════════════════════════════\n// Main Workspace Page\n// ═══════════════════════════════════════════════════════════════\n\nexport function WorkspacePage() {\n const [tabs, setTabs] = useState<OpenTab[]>([]);\n const [activeTab, setActiveTab] = useState<string | null>(null);\n const [projectInfo, setProjectInfo] = useState<WorkspaceInfo | null>(null);\n const [codeMode, setCodeMode] = useState<{ state: string; active: boolean } | null>(null);\n const [leftWidth, setLeftWidth] = useState(240);\n const [rightWidth, setRightWidth] = useState(280);\n const [bottomHeight, setBottomHeight] = useState(260);\n const [bottomMaximized, setBottomMaximized] = useState(false);\n const [showLeft, setShowLeft] = useState(true);\n const [showRight, setShowRight] = useState(true);\n const [showFolderPicker, setShowFolderPicker] = useState(false);\n const [folderInput, setFolderInput] = useState(\"\");\n const [folderError, setFolderError] = useState(\"\");\n const [folderLoading, setFolderLoading] = useState(false);\n const [workspaceKey, setWorkspaceKey] = useState(0);\n\n // Load project info and code mode\n useEffect(() => {\n api.workspace.info().then(setProjectInfo).catch(() => {});\n api.code.status().then((s) => setCodeMode({ state: s.state, active: s.active })).catch(() => {});\n }, []);\n\n async function handleChangeWorkspace() {\n const path = folderInput.trim();\n if (!path) return;\n setFolderLoading(true);\n setFolderError(\"\");\n try {\n await api.workspace.setRoot(path);\n const info = await api.workspace.info();\n setProjectInfo(info);\n setShowFolderPicker(false);\n setFolderInput(\"\");\n // Reset all panels and close all tabs\n setTabs([]);\n setActiveTab(null);\n setWorkspaceKey((k) => k + 1);\n } catch (err: any) {\n setFolderError(err.message || \"Invalid path\");\n } finally {\n setFolderLoading(false);\n }\n }\n\n // Open a file in a tab\n async function openFile(path: string) {\n // Check if already open\n const existing = tabs.find((t) => t.path === path);\n if (existing) {\n setActiveTab(path);\n return;\n }\n\n try {\n const file = await api.workspace.file(path);\n const ext = file.ext || (path.includes(\".\") ? \".\" + path.split(\".\").pop()! : \"\");\n const newTab: OpenTab = {\n path,\n name: file.name,\n content: file.content,\n language: extToLanguage(ext),\n dirty: false,\n originalContent: file.content,\n };\n setTabs((prev) => [...prev, newTab]);\n setActiveTab(path);\n } catch {\n // Could not open file\n }\n }\n\n function closeTab(path: string) {\n setTabs((prev) => prev.filter((t) => t.path !== path));\n if (activeTab === path) {\n const remaining = tabs.filter((t) => t.path !== path);\n setActiveTab(remaining.length > 0 ? remaining[remaining.length - 1].path : null);\n }\n }\n\n async function saveTab(path: string) {\n const tab = tabs.find((t) => t.path === path);\n if (!tab || !tab.dirty) return;\n\n try {\n await api.workspace.saveFile(path, tab.content);\n setTabs((prev) =>\n prev.map((t) =>\n t.path === path\n ? { ...t, dirty: false, originalContent: t.content }\n : t\n )\n );\n } catch {\n // Save failed\n }\n }\n\n function updateTabContent(path: string, content: string) {\n setTabs((prev) =>\n prev.map((t) =>\n t.path === path\n ? { ...t, content, dirty: content !== t.originalContent }\n : t\n )\n );\n }\n\n // Resizer handlers\n function useResizer(\n direction: \"horizontal\" | \"vertical\",\n setValue: React.Dispatch<React.SetStateAction<number>>,\n min: number,\n max: number,\n invert: boolean = false\n ) {\n const dragging = useRef(false);\n\n const onMouseDown = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n dragging.current = true;\n const startPos = direction === \"horizontal\" ? e.clientX : e.clientY;\n let currentValue: number;\n setValue((v) => { currentValue = v; return v; });\n\n function onMouseMove(e2: MouseEvent) {\n if (!dragging.current) return;\n const rawDelta = direction === \"horizontal\"\n ? e2.clientX - startPos\n : startPos - e2.clientY; // inverted for bottom panel\n const delta = invert ? -rawDelta : rawDelta;\n setValue(Math.min(max, Math.max(min, currentValue! + delta)));\n }\n\n function onMouseUp() {\n dragging.current = false;\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n }\n\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n }, [direction, setValue, min, max, invert]);\n\n return { onMouseDown };\n }\n\n const leftResizer = useResizer(\"horizontal\", setLeftWidth, 160, 400);\n // Right panel's resizer sits on its LEFT edge, so mouse delta is inverted\n const rightResizer = useResizer(\"horizontal\", setRightWidth, 200, 450, true);\n const bottomResizer = useResizer(\"vertical\", setBottomHeight, 120, 500);\n\n return (\n <div className=\"flex h-full w-full flex-col overflow-hidden bg-background\">\n {/* Workspace header bar */}\n <div className=\"flex items-center gap-3 border-b border-border bg-muted/20 px-4 py-1.5\">\n <div className=\"flex items-center gap-2 text-sm\">\n <FolderInput className=\"h-4 w-4 text-mercury-400\" />\n <span className=\"font-medium text-foreground\">\n {projectInfo?.projectName || \"Workspace\"}\n </span>\n <span className=\"text-xs text-muted-foreground font-mono truncate max-w-[300px]\" title={projectInfo?.cwd}>\n {projectInfo?.cwd || \"—\"}\n </span>\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 gap-1 px-2 text-xs text-muted-foreground hover:text-foreground\"\n onClick={() => { setShowFolderPicker(!showFolderPicker); setFolderInput(projectInfo?.cwd || \"\"); setFolderError(\"\"); }}\n >\n Change Folder\n </Button>\n <span className=\"flex-1\" />\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-2 text-xs\"\n onClick={() => setShowLeft(!showLeft)}\n >\n {showLeft ? \"Hide Explorer\" : \"Show Explorer\"}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-2 text-xs\"\n onClick={() => setShowRight(!showRight)}\n >\n {showRight ? \"Hide Git\" : \"Show Git\"}\n </Button>\n </div>\n\n {/* Folder picker dropdown */}\n <AnimatePresence>\n {showFolderPicker && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n className=\"overflow-hidden border-b border-border\"\n >\n <div className=\"flex items-center gap-2 bg-muted/10 px-4 py-2\">\n <input\n value={folderInput}\n onChange={(e) => { setFolderInput(e.target.value); setFolderError(\"\"); }}\n onKeyDown={(e) => { if (e.key === \"Enter\") handleChangeWorkspace(); if (e.key === \"Escape\") setShowFolderPicker(false); }}\n placeholder=\"/path/to/project\"\n className=\"flex-1 rounded-md border border-border bg-background px-3 py-1.5 text-sm font-mono text-foreground placeholder:text-muted-foreground/50 focus:outline-none focus:ring-1 focus:ring-primary/40\"\n autoFocus\n />\n <Button\n size=\"sm\"\n className=\"h-7 gap-1 text-xs\"\n onClick={handleChangeWorkspace}\n disabled={folderLoading || !folderInput.trim()}\n >\n {folderLoading ? <Loader2 className=\"h-3 w-3 animate-spin\" /> : <Check className=\"h-3 w-3\" />}\n Open\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-7 text-xs\"\n onClick={() => setShowFolderPicker(false)}\n >\n Cancel\n </Button>\n </div>\n {folderError && (\n <p className=\"px-4 pb-2 text-xs text-red-400\">{folderError}</p>\n )}\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Main content area (horizontal split) */}\n {!bottomMaximized && (\n <div className=\"flex flex-1 min-h-0 overflow-hidden\">\n {/* Left Panel — File Explorer */}\n {showLeft && (\n <>\n <div style={{ width: leftWidth }} className=\"shrink-0 overflow-hidden border-r border-border\">\n <FileExplorer key={workspaceKey} onOpenFile={openFile} openFiles={tabs.map((t) => t.path)} />\n </div>\n {/* Left resizer */}\n <div\n {...leftResizer}\n className=\"w-1 shrink-0 cursor-col-resize hover:bg-primary/30 active:bg-primary/50 transition-colors\"\n />\n </>\n )}\n\n {/* Center Panel — Editor Tabs */}\n <div className=\"flex-1 min-w-0 overflow-hidden\">\n <EditorPanel\n tabs={tabs}\n activeTab={activeTab}\n onSelectTab={setActiveTab}\n onCloseTab={closeTab}\n onSave={saveTab}\n onContentChange={updateTabContent}\n />\n </div>\n\n {/* Right resizer */}\n {showRight && (\n <div\n {...rightResizer}\n className=\"w-1 shrink-0 cursor-col-resize hover:bg-primary/30 active:bg-primary/50 transition-colors\"\n />\n )}\n\n {/* Right Panel — Git */}\n {showRight && (\n <div style={{ width: rightWidth }} className=\"shrink-0 overflow-hidden border-l border-border\">\n <GitPanel key={workspaceKey} />\n </div>\n )}\n </div>\n )}\n\n {/* Bottom resizer (hidden when maximized) */}\n {!bottomMaximized && (\n <div\n {...bottomResizer}\n className=\"h-1 shrink-0 cursor-row-resize hover:bg-primary/30 active:bg-primary/50 transition-colors border-t border-border\"\n />\n )}\n\n {/* Bottom Panel — Terminal + Chat */}\n <div\n style={bottomMaximized ? undefined : { height: bottomHeight }}\n className={cn(\n \"overflow-hidden\",\n bottomMaximized ? \"flex-1 min-h-0\" : \"shrink-0\"\n )}\n >\n <BottomPanel\n projectInfo={projectInfo}\n codeMode={codeMode}\n isMaximized={bottomMaximized}\n onToggleMaximize={() => setBottomMaximized((v) => !v)}\n />\n </div>\n </div>\n );\n}\n"],"names":["__iconNode","Circle","createLucideIcon","FileCode","FolderInput","FolderTree","GitCommitHorizontal","Maximize2","Minimize2","Minus","RefreshCw","Upload","extToLanguage","ext","fileIcon","name","isDir","isOpen","FolderOpen","jsx","Folder","FileText","statusIcon","status","FileExplorer","onOpenFile","openFiles","tree","setTree","useState","expandedDirs","setExpandedDirs","dirContents","setDirContents","loading","setLoading","useEffect","loadDir","path","data","api","prev","toggleDir","next","renderItems","items","parentPath","item","fullPath","isExpanded","subTree","jsxs","cn","ChevronDown","ChevronRight","Loader2","Button","ScrollArea","EditorPanel","tabs","activeTab","onSelectTab","onCloseTab","onSave","onContentChange","textareaRef","useRef","scrollRef","current","t","handleKey","e","tab","X","Badge","_a","SyntaxHighlighter","oneDark","GitPanel","gitStatus","setGitStatus","branches","setBranches","commits","setCommits","commitMsg","setCommitMsg","showBranches","setShowBranches","showLog","setShowLog","refreshing","setRefreshing","actionLoading","setActionLoading","feedback","setFeedback","refresh","useCallback","showToast","statusData","branchData","logData","err","showFeedbackMsg","type","msg","handleStage","files","handleUnstage","handleCommit","result","handlePush","handlePull","handleCheckout","branch","handleGenerateMessage","f","stagedFiles","unstagedFiles","GitBranch","Download","AnimatePresence","motion","ArrowUp","ArrowDown","b","Check","Sparkles","Plus","commit","GitCommitIcon","BottomPanel","projectInfo","codeMode","isMaximized","onToggleMaximize","activeBottomTab","setActiveBottomTab","terminalHistory","setTerminalHistory","terminalInput","setTerminalInput","terminalLoading","setTerminalLoading","cmdHistory","setCmdHistory","cmdHistoryIdx","setCmdHistoryIdx","terminalRef","termInputRef","chatInput","setChatInput","connected","useSSE","streamingText","useChatStore","isStreaming","waiting","messages","addMessage","setWaiting","clearStreaming","activeThreadId","setActiveThread","bumpThreadVersion","isBusy","handleTerminalExec","cmd","handleTerminalKeyDown","newIdx","handleChatSend","content","threadId","recentMessages","Zap","Fragment","TerminalIcon","MessageSquare","entry","MarkdownRenderer","Send","WorkspacePage","setTabs","setActiveTab","setProjectInfo","setCodeMode","leftWidth","setLeftWidth","rightWidth","setRightWidth","bottomHeight","setBottomHeight","bottomMaximized","setBottomMaximized","showLeft","setShowLeft","showRight","setShowRight","showFolderPicker","setShowFolderPicker","folderInput","setFolderInput","folderError","setFolderError","folderLoading","setFolderLoading","workspaceKey","setWorkspaceKey","s","handleChangeWorkspace","info","k","openFile","file","newTab","closeTab","remaining","saveTab","updateTabContent","useResizer","direction","setValue","min","max","invert","dragging","startPos","currentValue","v","onMouseMove","e2","rawDelta","delta","onMouseUp","leftResizer","rightResizer","bottomResizer"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9]}
|
|
1
|
+
{"version":3,"file":"Workspace-BYLf-wTJ.js","sources":["../../node_modules/lucide-react/dist/esm/icons/circle.js","../../node_modules/lucide-react/dist/esm/icons/file-code.js","../../node_modules/lucide-react/dist/esm/icons/folder-input.js","../../node_modules/lucide-react/dist/esm/icons/folder-tree.js","../../node_modules/lucide-react/dist/esm/icons/git-commit-horizontal.js","../../node_modules/lucide-react/dist/esm/icons/maximize-2.js","../../node_modules/lucide-react/dist/esm/icons/minimize-2.js","../../node_modules/lucide-react/dist/esm/icons/minus.js","../../node_modules/lucide-react/dist/esm/icons/refresh-cw.js","../../node_modules/lucide-react/dist/esm/icons/upload.js","../../src/pages/Workspace.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }]];\nconst Circle = createLucideIcon(\"circle\", __iconNode);\n\nexport { __iconNode, Circle as default };\n//# sourceMappingURL=circle.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 12.5 8 15l2 2.5\", key: \"1tg20x\" }],\n [\"path\", { d: \"m14 12.5 2 2.5-2 2.5\", key: \"yinavb\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n [\"path\", { d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z\", key: \"1mlx9k\" }]\n];\nconst FileCode = createLucideIcon(\"file-code\", __iconNode);\n\nexport { __iconNode, FileCode as default };\n//# sourceMappingURL=file-code.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M2 9V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-1\",\n key: \"fm4g5t\"\n }\n ],\n [\"path\", { d: \"M2 13h10\", key: \"pgb2dq\" }],\n [\"path\", { d: \"m9 16 3-3-3-3\", key: \"6m91ic\" }]\n];\nconst FolderInput = createLucideIcon(\"folder-input\", __iconNode);\n\nexport { __iconNode, FolderInput as default };\n//# sourceMappingURL=folder-input.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M20 10a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2.5a1 1 0 0 1-.8-.4l-.9-1.2A1 1 0 0 0 15 3h-2a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z\",\n key: \"hod4my\"\n }\n ],\n [\n \"path\",\n {\n d: \"M20 21a1 1 0 0 0 1-1v-3a1 1 0 0 0-1-1h-2.9a1 1 0 0 1-.88-.55l-.42-.85a1 1 0 0 0-.92-.6H13a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z\",\n key: \"w4yl2u\"\n }\n ],\n [\"path\", { d: \"M3 5a2 2 0 0 0 2 2h3\", key: \"f2jnh7\" }],\n [\"path\", { d: \"M3 3v13a2 2 0 0 0 2 2h3\", key: \"k8epm1\" }]\n];\nconst FolderTree = createLucideIcon(\"folder-tree\", __iconNode);\n\nexport { __iconNode, FolderTree as default };\n//# sourceMappingURL=folder-tree.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }],\n [\"line\", { x1: \"3\", x2: \"9\", y1: \"12\", y2: \"12\", key: \"1dyftd\" }],\n [\"line\", { x1: \"15\", x2: \"21\", y1: \"12\", y2: \"12\", key: \"oup4p8\" }]\n];\nconst GitCommitHorizontal = createLucideIcon(\"git-commit-horizontal\", __iconNode);\n\nexport { __iconNode, GitCommitHorizontal as default };\n//# sourceMappingURL=git-commit-horizontal.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M15 3h6v6\", key: \"1q9fwt\" }],\n [\"path\", { d: \"m21 3-7 7\", key: \"1l2asr\" }],\n [\"path\", { d: \"m3 21 7-7\", key: \"tjx5ai\" }],\n [\"path\", { d: \"M9 21H3v-6\", key: \"wtvkvv\" }]\n];\nconst Maximize2 = createLucideIcon(\"maximize-2\", __iconNode);\n\nexport { __iconNode, Maximize2 as default };\n//# sourceMappingURL=maximize-2.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m14 10 7-7\", key: \"oa77jy\" }],\n [\"path\", { d: \"M20 10h-6V4\", key: \"mjg0md\" }],\n [\"path\", { d: \"m3 21 7-7\", key: \"tjx5ai\" }],\n [\"path\", { d: \"M4 14h6v6\", key: \"rmj7iw\" }]\n];\nconst Minimize2 = createLucideIcon(\"minimize-2\", __iconNode);\n\nexport { __iconNode, Minimize2 as default };\n//# sourceMappingURL=minimize-2.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }]];\nconst Minus = createLucideIcon(\"minus\", __iconNode);\n\nexport { __iconNode, Minus as default };\n//# sourceMappingURL=minus.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\", key: \"v9h5vc\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }],\n [\"path\", { d: \"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\", key: \"3uifl3\" }],\n [\"path\", { d: \"M8 16H3v5\", key: \"1cv678\" }]\n];\nconst RefreshCw = createLucideIcon(\"refresh-cw\", __iconNode);\n\nexport { __iconNode, RefreshCw as default };\n//# sourceMappingURL=refresh-cw.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 3v12\", key: \"1x0j5s\" }],\n [\"path\", { d: \"m17 8-5-5-5 5\", key: \"7q97r8\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }]\n];\nconst Upload = createLucideIcon(\"upload\", __iconNode);\n\nexport { __iconNode, Upload as default };\n//# sourceMappingURL=upload.js.map\n","import { useState, useEffect, useRef, useCallback } from \"react\";\nimport {\n ChevronRight,\n ChevronDown,\n File,\n Folder,\n FolderOpen,\n X,\n GitBranch,\n GitCommit as GitCommitIcon,\n GitPullRequest,\n Plus,\n Minus,\n Check,\n Upload,\n Download,\n RefreshCw,\n Terminal as TerminalIcon,\n MessageSquare,\n Send,\n Loader2,\n Circle,\n FileCode,\n FileText,\n FolderTree,\n ArrowUp,\n ArrowDown,\n Search,\n MoreHorizontal,\n Copy,\n Eye,\n Zap,\n Play,\n Sparkles,\n FolderInput,\n Maximize2,\n Minimize2,\n} from \"lucide-react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport { cn } from \"@/lib/utils\";\nimport { Button } from \"@/components/ui/button\";\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\nimport { Badge } from \"@/components/ui/badge\";\nimport api from \"@/lib/api\";\nimport type {\n WorkspaceTree,\n WorkspaceFile,\n WorkspaceInfo,\n GitStatus,\n GitFile,\n GitBranch as GitBranchType,\n GitCommit,\n TerminalResult,\n} from \"@/lib/api\";\nimport { useChatStore } from \"@/stores/chat\";\nimport { useSSE } from \"@/hooks/useSSE\";\nimport { MarkdownRenderer } from \"@/components/chat/MarkdownRenderer\";\nimport { Prism as SyntaxHighlighter } from \"react-syntax-highlighter\";\nimport { oneDark } from \"react-syntax-highlighter/dist/esm/styles/prism\";\n\n// ═══════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════\n\ninterface OpenTab {\n path: string;\n name: string;\n content: string;\n language: string;\n dirty: boolean;\n originalContent: string;\n}\n\ninterface TerminalEntry {\n id: string;\n command: string;\n output: string;\n exitCode: number;\n timestamp: number;\n}\n\n// ═══════════════════════════════════════════════════════════════\n// Utilities\n// ═══════════════════════════════════════════════════════════════\n\nfunction extToLanguage(ext: string): string {\n const map: Record<string, string> = {\n \".ts\": \"typescript\", \".tsx\": \"tsx\", \".js\": \"javascript\", \".jsx\": \"jsx\",\n \".py\": \"python\", \".rs\": \"rust\", \".go\": \"go\", \".java\": \"java\",\n \".json\": \"json\", \".yaml\": \"yaml\", \".yml\": \"yaml\", \".toml\": \"toml\",\n \".md\": \"markdown\", \".txt\": \"text\", \".css\": \"css\", \".html\": \"html\",\n \".sh\": \"bash\", \".bash\": \"bash\", \".zsh\": \"bash\", \".sql\": \"sql\",\n \".xml\": \"xml\", \".svg\": \"xml\", \".dockerfile\": \"docker\",\n \".env\": \"text\", \".gitignore\": \"text\", \".c\": \"c\", \".cpp\": \"cpp\",\n \".h\": \"c\", \".hpp\": \"cpp\", \".rb\": \"ruby\", \".php\": \"php\",\n \".swift\": \"swift\", \".kt\": \"kotlin\", \".scala\": \"scala\",\n \".lua\": \"lua\", \".r\": \"r\", \".dart\": \"dart\", \".graphql\": \"graphql\",\n \".scss\": \"scss\", \".less\": \"less\", \".vue\": \"markup\",\n \".prisma\": \"text\", \".proto\": \"protobuf\",\n };\n return map[ext.toLowerCase()] || \"text\";\n}\n\nfunction fileIcon(name: string, isDir: boolean, isOpen?: boolean) {\n if (isDir) {\n return isOpen\n ? <FolderOpen className=\"h-4 w-4 text-mercury-400\" />\n : <Folder className=\"h-4 w-4 text-mercury-400/70\" />;\n }\n const ext = name.includes(\".\") ? \".\" + name.split(\".\").pop()! : \"\";\n const codeExts = [\".ts\", \".tsx\", \".js\", \".jsx\", \".py\", \".rs\", \".go\", \".java\", \".sh\"];\n if (codeExts.includes(ext)) return <FileCode className=\"h-4 w-4 text-blue-400\" />;\n return <FileText className=\"h-4 w-4 text-muted-foreground\" />;\n}\n\nfunction statusColor(status: string): string {\n switch (status) {\n case \"modified\": return \"text-amber-400\";\n case \"added\": return \"text-emerald-400\";\n case \"deleted\": return \"text-red-400\";\n case \"untracked\": return \"text-gray-400\";\n case \"renamed\": return \"text-purple-400\";\n default: return \"text-muted-foreground\";\n }\n}\n\nfunction statusIcon(status: string) {\n switch (status) {\n case \"modified\": return <span className=\"text-amber-400 text-xs font-bold\">M</span>;\n case \"added\": return <span className=\"text-emerald-400 text-xs font-bold\">A</span>;\n case \"deleted\": return <span className=\"text-red-400 text-xs font-bold\">D</span>;\n case \"untracked\": return <span className=\"text-gray-400 text-xs font-bold\">U</span>;\n case \"renamed\": return <span className=\"text-purple-400 text-xs font-bold\">R</span>;\n default: return <span className=\"text-muted-foreground text-xs\">?</span>;\n }\n}\n\n// ═══════════════════════════════════════════════════════════════\n// File Explorer Panel (Left)\n// ═══════════════════════════════════════════════════════════════\n\nfunction FileExplorer({\n onOpenFile,\n openFiles,\n}: {\n onOpenFile: (path: string) => void;\n openFiles: string[];\n}) {\n const [tree, setTree] = useState<WorkspaceTree | null>(null);\n const [expandedDirs, setExpandedDirs] = useState<Set<string>>(new Set([\".\"]));\n const [dirContents, setDirContents] = useState<Map<string, WorkspaceTree>>(new Map());\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n loadDir();\n }, []);\n\n async function loadDir(path?: string) {\n try {\n const data = await api.workspace.tree(path);\n if (!path || path === \".\") {\n setTree(data);\n setLoading(false);\n } else {\n setDirContents((prev) => new Map(prev).set(path, data));\n }\n } catch {\n setLoading(false);\n }\n }\n\n function toggleDir(path: string) {\n const next = new Set(expandedDirs);\n if (next.has(path)) {\n next.delete(path);\n } else {\n next.add(path);\n if (!dirContents.has(path)) {\n loadDir(path);\n }\n }\n setExpandedDirs(next);\n }\n\n function renderItems(items: WorkspaceTree[\"items\"], parentPath: string) {\n return items.map((item) => {\n const fullPath = parentPath === \".\" ? item.name : `${parentPath}/${item.name}`;\n const isExpanded = expandedDirs.has(fullPath);\n const isOpen = openFiles.includes(fullPath);\n\n if (item.isDirectory) {\n const subTree = dirContents.get(fullPath);\n return (\n <div key={fullPath}>\n <button\n onClick={() => toggleDir(fullPath)}\n className={cn(\n \"flex w-full items-center gap-1.5 rounded-md px-2 py-1 text-left text-[13px] transition-colors\",\n \"hover:bg-muted/60\"\n )}\n >\n {isExpanded\n ? <ChevronDown className=\"h-3 w-3 shrink-0 text-muted-foreground\" />\n : <ChevronRight className=\"h-3 w-3 shrink-0 text-muted-foreground\" />\n }\n {fileIcon(item.name, true, isExpanded)}\n <span className=\"truncate\">{item.name}</span>\n </button>\n {isExpanded && subTree && (\n <div className=\"ml-3 border-l border-border/30 pl-1\">\n {renderItems(subTree.items, fullPath)}\n </div>\n )}\n </div>\n );\n }\n\n return (\n <button\n key={fullPath}\n onClick={() => onOpenFile(fullPath)}\n className={cn(\n \"flex w-full items-center gap-1.5 rounded-md px-2 py-1 text-left text-[13px] transition-colors\",\n isOpen\n ? \"bg-primary/10 text-primary\"\n : \"hover:bg-muted/60 text-foreground/80\"\n )}\n >\n <span className=\"w-3\" />\n {fileIcon(item.name, false)}\n <span className=\"truncate\">{item.name}</span>\n </button>\n );\n });\n }\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 className=\"h-5 w-5 animate-spin text-primary\" />\n </div>\n );\n }\n\n return (\n <div className=\"flex h-full flex-col\">\n <div className=\"flex items-center justify-between border-b border-border px-3 py-2\">\n <div className=\"flex items-center gap-1.5\">\n <FolderTree className=\"h-4 w-4 text-mercury-400\" />\n <span className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Explorer\n </span>\n </div>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6\" onClick={() => loadDir()}>\n <RefreshCw className=\"h-3 w-3\" />\n </Button>\n </div>\n <ScrollArea className=\"flex-1 px-1 py-1\">\n {tree && renderItems(tree.items, \".\")}\n </ScrollArea>\n </div>\n );\n}\n\n// ═══════════════════════════════════════════════════════════════\n// Editor Tabs Panel (Center)\n// ═══════════════════════════════════════════════════════════════\n\nfunction EditorPanel({\n tabs,\n activeTab,\n onSelectTab,\n onCloseTab,\n onSave,\n onContentChange,\n}: {\n tabs: OpenTab[];\n activeTab: string | null;\n onSelectTab: (path: string) => void;\n onCloseTab: (path: string) => void;\n onSave: (path: string) => void;\n onContentChange: (path: string, content: string) => void;\n}) {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const scrollRef = useRef<HTMLDivElement>(null);\n const current = tabs.find((t) => t.path === activeTab);\n\n // Handle keyboard shortcuts\n useEffect(() => {\n function handleKey(e: KeyboardEvent) {\n if ((e.metaKey || e.ctrlKey) && e.key === \"s\") {\n e.preventDefault();\n if (activeTab) onSave(activeTab);\n }\n }\n window.addEventListener(\"keydown\", handleKey);\n return () => window.removeEventListener(\"keydown\", handleKey);\n }, [activeTab, onSave]);\n\n if (tabs.length === 0) {\n return (\n <div className=\"flex h-full flex-col items-center justify-center gap-4 text-center\">\n <div className=\"rounded-2xl bg-primary/10 p-6\">\n <FileCode className=\"h-12 w-12 text-primary/60\" />\n </div>\n <div>\n <h3 className=\"text-base font-semibold text-foreground\">No files open</h3>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Select a file from the explorer to start editing\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex h-full flex-col\">\n {/* Tab bar */}\n <div className=\"flex items-center gap-0 overflow-x-auto border-b border-border bg-muted/20\">\n {tabs.map((tab) => (\n <button\n key={tab.path}\n onClick={() => onSelectTab(tab.path)}\n className={cn(\n \"group flex items-center gap-2 border-r border-border/30 px-3 py-1.5 text-[13px] transition-colors\",\n tab.path === activeTab\n ? \"bg-background text-foreground border-b-2 border-b-primary\"\n : \"text-muted-foreground hover:bg-muted/40 hover:text-foreground\"\n )}\n >\n {fileIcon(tab.name, false)}\n <span className=\"max-w-[120px] truncate\">{tab.name}</span>\n {tab.dirty && (\n <Circle className=\"h-2 w-2 fill-primary text-primary\" />\n )}\n <button\n onClick={(e) => { e.stopPropagation(); onCloseTab(tab.path); }}\n className=\"ml-1 rounded p-0.5 opacity-0 transition-opacity group-hover:opacity-100 hover:bg-muted\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </button>\n ))}\n </div>\n\n {/* Editor area */}\n {current && (\n <div className=\"relative flex flex-col flex-1 min-h-0\">\n {/* Info bar */}\n <div className=\"flex items-center justify-between border-b border-border/30 bg-muted/10 px-3 py-1\">\n <span className=\"text-xs text-muted-foreground font-mono\">{current.path}</span>\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"text-[10px] px-1.5 py-0\">\n {current.language}\n </Badge>\n {current.dirty && (\n <Button size=\"sm\" variant=\"ghost\" className=\"h-5 gap-1 px-2 text-[10px]\" onClick={() => onSave(current.path)}>\n <span className=\"text-primary\">Save</span>\n <span className=\"text-muted-foreground\">Cmd+S</span>\n </Button>\n )}\n </div>\n </div>\n\n {/* Code content — syntax highlighted with editable overlay */}\n <div className=\"flex-1 min-h-0 overflow-auto bg-[#282c34]\" ref={scrollRef} onClick={() => textareaRef.current?.focus()}>\n <div className=\"relative\" style={{ minWidth: \"fit-content\" }}>\n {/* Syntax highlighted layer (visual) */}\n <SyntaxHighlighter\n language={current.language}\n style={oneDark}\n showLineNumbers\n lineNumberStyle={{\n minWidth: \"3em\",\n paddingRight: \"1em\",\n color: \"rgba(255,255,255,0.25)\",\n fontSize: \"13px\",\n lineHeight: \"20px\",\n userSelect: \"none\",\n }}\n customStyle={{\n margin: 0,\n padding: \"0.5rem 0\",\n background: \"transparent\",\n fontSize: \"13px\",\n lineHeight: \"20px\",\n fontFamily: \"var(--font-mono, 'Geist Mono', ui-monospace, monospace)\",\n }}\n codeTagProps={{\n style: {\n fontSize: \"13px\",\n lineHeight: \"20px\",\n fontFamily: \"var(--font-mono, 'Geist Mono', ui-monospace, monospace)\",\n },\n }}\n wrapLongLines={false}\n >\n {current.content || \" \"}\n </SyntaxHighlighter>\n {/* Transparent textarea overlay for editing */}\n <textarea\n ref={textareaRef}\n value={current.content}\n onChange={(e) => onContentChange(current.path, e.target.value)}\n spellCheck={false}\n className={cn(\n \"absolute top-0 left-0 w-full h-full resize-none bg-transparent text-transparent caret-white\",\n \"font-mono text-[13px] leading-[20px]\",\n \"focus:outline-none\",\n \"whitespace-pre\",\n \"pointer-events-none focus:pointer-events-auto\"\n )}\n style={{\n tabSize: 2,\n padding: \"0.5rem 0 0.5rem 4.5em\",\n fontFamily: \"var(--font-mono, 'Geist Mono', ui-monospace, monospace)\",\n overflow: \"hidden\",\n }}\n onFocus={() => {\n // Enable pointer events while editing\n if (textareaRef.current) {\n textareaRef.current.style.pointerEvents = \"auto\";\n }\n }}\n onBlur={() => {\n // Disable pointer events when not editing so scroll passes through\n if (textareaRef.current) {\n textareaRef.current.style.pointerEvents = \"none\";\n }\n }}\n onWheel={(e) => {\n // Forward wheel events to parent scroll container while focused\n if (scrollRef.current) {\n scrollRef.current.scrollTop += e.deltaY;\n scrollRef.current.scrollLeft += e.deltaX;\n }\n }}\n />\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\n// ═══════════════════════════════════════════════════════════════\n// Git Panel (Right)\n// ═══════════════════════════════════════════════════════════════\n\nfunction GitPanel() {\n const [gitStatus, setGitStatus] = useState<GitStatus | null>(null);\n const [branches, setBranches] = useState<GitBranchType[]>([]);\n const [commits, setCommits] = useState<GitCommit[]>([]);\n const [commitMsg, setCommitMsg] = useState(\"\");\n const [showBranches, setShowBranches] = useState(false);\n const [showLog, setShowLog] = useState(false);\n const [loading, setLoading] = useState(true);\n const [refreshing, setRefreshing] = useState(false);\n const [actionLoading, setActionLoading] = useState<string | null>(null);\n const [feedback, setFeedback] = useState<{ type: \"success\" | \"error\"; msg: string } | null>(null);\n\n const refresh = useCallback(async (showToast: boolean = false) => {\n setRefreshing(true);\n try {\n const [statusData, branchData, logData] = await Promise.all([\n api.git.status(),\n api.git.branches(),\n api.git.log(15),\n ]);\n setGitStatus(statusData);\n setBranches(branchData.branches);\n setCommits(logData.commits);\n if (showToast) {\n setFeedback({ type: \"success\", msg: \"Refreshed\" });\n setTimeout(() => setFeedback(null), 1500);\n }\n } catch (err: any) {\n setFeedback({ type: \"error\", msg: err.message });\n } finally {\n setLoading(false);\n setRefreshing(false);\n }\n }, []);\n\n useEffect(() => { refresh(); }, [refresh]);\n\n function showFeedbackMsg(type: \"success\" | \"error\", msg: string) {\n setFeedback({ type, msg });\n setTimeout(() => setFeedback(null), 3000);\n }\n\n async function handleStage(files: string[]) {\n setActionLoading(\"stage\");\n try {\n await api.git.stage(files);\n await refresh();\n } catch (err: any) {\n showFeedbackMsg(\"error\", err.message);\n } finally {\n setActionLoading(null);\n }\n }\n\n async function handleUnstage(files: string[]) {\n setActionLoading(\"unstage\");\n try {\n await api.git.unstage(files);\n await refresh();\n } catch (err: any) {\n showFeedbackMsg(\"error\", err.message);\n } finally {\n setActionLoading(null);\n }\n }\n\n async function handleCommit() {\n if (!commitMsg.trim()) return;\n setActionLoading(\"commit\");\n try {\n const result = await api.git.commit(commitMsg.trim());\n setCommitMsg(\"\");\n showFeedbackMsg(\"success\", \"Committed successfully\");\n await refresh();\n } catch (err: any) {\n showFeedbackMsg(\"error\", err.message);\n } finally {\n setActionLoading(null);\n }\n }\n\n async function handlePush() {\n setActionLoading(\"push\");\n try {\n const result = await api.git.push();\n showFeedbackMsg(\"success\", result.message || \"Pushed\");\n await refresh();\n } catch (err: any) {\n showFeedbackMsg(\"error\", err.message);\n } finally {\n setActionLoading(null);\n }\n }\n\n async function handlePull() {\n setActionLoading(\"pull\");\n try {\n const result = await api.git.pull();\n showFeedbackMsg(\"success\", result.message || \"Pulled\");\n await refresh();\n } catch (err: any) {\n showFeedbackMsg(\"error\", err.message);\n } finally {\n setActionLoading(null);\n }\n }\n\n async function handleCheckout(branch: string) {\n setActionLoading(\"checkout\");\n try {\n await api.git.checkout(branch);\n showFeedbackMsg(\"success\", `Switched to ${branch}`);\n setShowBranches(false);\n await refresh();\n } catch (err: any) {\n showFeedbackMsg(\"error\", err.message);\n } finally {\n setActionLoading(null);\n }\n }\n\n async function handleGenerateMessage() {\n setActionLoading(\"generate\");\n try {\n // Auto-stage all unstaged files first\n const unstaged = gitStatus?.files.filter((f) => !f.staged) || [];\n if (unstaged.length > 0) {\n await api.git.stage([\".\"]);\n await refresh();\n }\n const result = await api.git.generateCommitMessage();\n const msg = typeof result === \"string\" ? result : result?.message || \"\";\n if (msg) {\n setCommitMsg(msg);\n showFeedbackMsg(\"success\", \"Message generated\");\n } else {\n showFeedbackMsg(\"error\", \"No message returned\");\n }\n } catch (err: any) {\n showFeedbackMsg(\"error\", err.message);\n } finally {\n setActionLoading(null);\n }\n }\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 className=\"h-5 w-5 animate-spin text-primary\" />\n </div>\n );\n }\n\n const stagedFiles = gitStatus?.files.filter((f) => f.staged) || [];\n const unstagedFiles = gitStatus?.files.filter((f) => !f.staged) || [];\n\n return (\n <div className=\"flex h-full flex-col\">\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-border px-3 py-2\">\n <div className=\"flex items-center gap-1.5\">\n <GitBranch className=\"h-4 w-4 text-mercury-400\" />\n <span className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Source Control\n </span>\n </div>\n <div className=\"flex items-center gap-1\">\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6\" onClick={handlePull} disabled={!!actionLoading}>\n <Download className=\"h-3 w-3\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6\" onClick={handlePush} disabled={!!actionLoading}>\n <Upload className=\"h-3 w-3\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={() => refresh(true)}\n disabled={!!actionLoading || refreshing}\n title=\"Refresh\"\n aria-label=\"Refresh\"\n >\n <RefreshCw className={cn(\"h-3 w-3\", refreshing && \"animate-spin\")} />\n </Button>\n </div>\n </div>\n\n <ScrollArea className=\"flex-1\">\n <div className=\"p-2 space-y-3\">\n {/* Feedback */}\n <AnimatePresence>\n {feedback && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n className={cn(\n \"rounded-md px-3 py-1.5 text-xs\",\n feedback.type === \"success\"\n ? \"bg-emerald-500/10 text-emerald-400 border border-emerald-500/20\"\n : \"bg-red-500/10 text-red-400 border border-red-500/20\"\n )}\n >\n {feedback.msg}\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Branch info */}\n <div className=\"space-y-1\">\n <button\n onClick={() => setShowBranches(!showBranches)}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors hover:bg-muted/60\"\n >\n <GitBranch className=\"h-3.5 w-3.5 text-primary\" />\n <span className=\"font-medium\">{gitStatus?.branch || \"—\"}</span>\n {gitStatus && gitStatus.ahead > 0 && (\n <Badge variant=\"outline\" className=\"text-[10px] px-1 py-0\">\n <ArrowUp className=\"h-2.5 w-2.5 mr-0.5\" />{gitStatus.ahead}\n </Badge>\n )}\n {gitStatus && gitStatus.behind > 0 && (\n <Badge variant=\"outline\" className=\"text-[10px] px-1 py-0\">\n <ArrowDown className=\"h-2.5 w-2.5 mr-0.5\" />{gitStatus.behind}\n </Badge>\n )}\n <ChevronRight className={cn(\"ml-auto h-3 w-3 transition-transform\", showBranches && \"rotate-90\")} />\n </button>\n\n {/* Branch picker */}\n <AnimatePresence>\n {showBranches && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n className=\"overflow-hidden\"\n >\n <div className=\"ml-2 space-y-0.5 border-l border-border/30 pl-2 py-1\">\n {branches.filter((b) => !b.name.startsWith(\"remotes/\")).map((b) => (\n <button\n key={b.name}\n onClick={() => !b.isCurrent && handleCheckout(b.name)}\n className={cn(\n \"flex w-full items-center gap-2 rounded-md px-2 py-1 text-xs transition-colors\",\n b.isCurrent\n ? \"bg-primary/10 text-primary\"\n : \"text-muted-foreground hover:bg-muted/60 hover:text-foreground\"\n )}\n disabled={b.isCurrent || !!actionLoading}\n >\n {b.isCurrent && <Check className=\"h-3 w-3\" />}\n <span className=\"truncate\">{b.name}</span>\n </button>\n ))}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n\n {/* Commit input */}\n <div className=\"space-y-1.5\">\n <div className=\"relative\">\n <textarea\n value={commitMsg}\n onChange={(e) => setCommitMsg(e.target.value)}\n placeholder=\"Commit message...\"\n rows={2}\n className={cn(\n \"w-full resize-none rounded-lg border border-border bg-muted/30 px-3 py-2 pr-9 text-sm text-foreground\",\n \"placeholder:text-muted-foreground/60 focus:outline-none focus:ring-1 focus:ring-primary/40\"\n )}\n />\n {/* Generate button inside textarea */}\n <button\n onClick={handleGenerateMessage}\n disabled={!!actionLoading}\n title=\"AI generate commit message\"\n className={cn(\n \"absolute right-2 top-2 rounded-md p-1.5 transition-colors border border-border/50\",\n \"text-primary/70 hover:text-primary hover:bg-primary/10 bg-background/80\",\n actionLoading === \"generate\" && \"animate-pulse\"\n )}\n >\n {actionLoading === \"generate\"\n ? <Loader2 className=\"h-4 w-4 animate-spin text-primary\" />\n : <Sparkles className=\"h-4 w-4\" />\n }\n </button>\n </div>\n <Button\n size=\"sm\"\n className=\"w-full h-7 gap-1.5 text-xs\"\n disabled={!commitMsg.trim() || stagedFiles.length === 0 || !!actionLoading}\n onClick={handleCommit}\n >\n {actionLoading === \"commit\"\n ? <Loader2 className=\"h-3 w-3 animate-spin\" />\n : <Check className=\"h-3 w-3\" />\n }\n Commit ({stagedFiles.length} staged)\n </Button>\n </div>\n\n {/* Staged Changes */}\n {stagedFiles.length > 0 && (\n <div>\n <div className=\"flex items-center justify-between px-1 mb-1\">\n <span className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider\">\n Staged ({stagedFiles.length})\n </span>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-5 w-5\" onClick={() => handleUnstage(stagedFiles.map((f) => f.path))}>\n <Minus className=\"h-3 w-3\" />\n </Button>\n </div>\n <div className=\"space-y-0.5\">\n {stagedFiles.map((f) => (\n <div\n key={`staged-${f.path}`}\n className=\"flex items-center gap-2 rounded-md px-2 py-1 text-xs hover:bg-muted/40 group\"\n >\n {statusIcon(f.status)}\n <span className=\"flex-1 truncate font-mono\">{f.path}</span>\n <button\n onClick={() => handleUnstage([f.path])}\n className=\"opacity-0 group-hover:opacity-100 transition-opacity\"\n >\n <Minus className=\"h-3 w-3 text-muted-foreground hover:text-foreground\" />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Unstaged Changes */}\n {unstagedFiles.length > 0 && (\n <div>\n <div className=\"flex items-center justify-between px-1 mb-1\">\n <span className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider\">\n Changes ({unstagedFiles.length})\n </span>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-5 w-5\" onClick={() => handleStage(unstagedFiles.map((f) => f.path))}>\n <Plus className=\"h-3 w-3\" />\n </Button>\n </div>\n <div className=\"space-y-0.5\">\n {unstagedFiles.map((f) => (\n <div\n key={`unstaged-${f.path}`}\n className=\"flex items-center gap-2 rounded-md px-2 py-1 text-xs hover:bg-muted/40 group\"\n >\n {statusIcon(f.status)}\n <span className=\"flex-1 truncate font-mono\">{f.path}</span>\n <button\n onClick={() => handleStage([f.path])}\n className=\"opacity-0 group-hover:opacity-100 transition-opacity\"\n >\n <Plus className=\"h-3 w-3 text-muted-foreground hover:text-foreground\" />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {stagedFiles.length === 0 && unstagedFiles.length === 0 && (\n <div className=\"py-4 text-center text-xs text-muted-foreground\">\n No changes detected\n </div>\n )}\n\n {/* Recent Commits */}\n <div>\n <button\n onClick={() => setShowLog(!showLog)}\n className=\"flex w-full items-center gap-1.5 px-1 mb-1\"\n >\n <ChevronRight className={cn(\"h-3 w-3 text-muted-foreground transition-transform\", showLog && \"rotate-90\")} />\n <span className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider\">\n Recent Commits\n </span>\n </button>\n <AnimatePresence>\n {showLog && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n className=\"overflow-hidden\"\n >\n <div className=\"space-y-0.5\">\n {commits.map((commit) => (\n <div\n key={commit.hash}\n className=\"rounded-md px-2 py-1.5 hover:bg-muted/40 transition-colors\"\n >\n <div className=\"flex items-start gap-2\">\n <GitCommitIcon className=\"h-3 w-3 mt-0.5 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-xs text-foreground line-clamp-2 leading-snug\">\n {commit.message}\n </p>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n <span className=\"font-mono\">{commit.short}</span>\n <span className=\"mx-1\">·</span>\n {commit.date}\n </p>\n </div>\n </div>\n </div>\n ))}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </div>\n </ScrollArea>\n </div>\n );\n}\n\n// ═══════════════════════════════════════════════════════════════\n// Bottom Panel — Terminal + Chat Input\n// ═══════════════════════════════════════════════════════════════\n\nfunction BottomPanel({\n projectInfo,\n codeMode,\n isMaximized,\n onToggleMaximize,\n}: {\n projectInfo: WorkspaceInfo | null;\n codeMode: { state: string; active: boolean } | null;\n isMaximized: boolean;\n onToggleMaximize: () => void;\n}) {\n const [activeBottomTab, setActiveBottomTab] = useState<\"terminal\" | \"chat\">(\"terminal\");\n const [terminalHistory, setTerminalHistory] = useState<TerminalEntry[]>([]);\n const [terminalInput, setTerminalInput] = useState(\"\");\n const [terminalLoading, setTerminalLoading] = useState(false);\n const [cmdHistory, setCmdHistory] = useState<string[]>([]);\n const [cmdHistoryIdx, setCmdHistoryIdx] = useState(-1);\n const terminalRef = useRef<HTMLDivElement>(null);\n const termInputRef = useRef<HTMLInputElement>(null);\n\n // Chat state\n const [chatInput, setChatInput] = useState(\"\");\n const { connected } = useSSE();\n const streamingText = useChatStore((s) => s.streamingText);\n const isStreaming = useChatStore((s) => s.isStreaming);\n const waiting = useChatStore((s) => s.waiting);\n const messages = useChatStore((s) => s.messages);\n const addMessage = useChatStore((s) => s.addMessage);\n const setWaiting = useChatStore((s) => s.setWaiting);\n const clearStreaming = useChatStore((s) => s.clearStreaming);\n const activeThreadId = useChatStore((s) => s.activeThreadId);\n const setActiveThread = useChatStore((s) => s.setActiveThread);\n const bumpThreadVersion = useChatStore((s) => s.bumpThreadVersion);\n\n const isBusy = isStreaming || waiting;\n\n // Scroll terminal to bottom\n useEffect(() => {\n if (terminalRef.current) {\n terminalRef.current.scrollTop = terminalRef.current.scrollHeight;\n }\n }, [terminalHistory]);\n\n async function handleTerminalExec() {\n const cmd = terminalInput.trim();\n if (!cmd || terminalLoading) return;\n setTerminalInput(\"\");\n setCmdHistory((prev) => [...prev, cmd]);\n setCmdHistoryIdx(-1);\n setTerminalLoading(true);\n\n try {\n const result = await api.terminal.exec(cmd);\n setTerminalHistory((prev) => [\n ...prev,\n {\n id: `${Date.now()}`,\n command: cmd,\n output: result.output || result.error || \"\",\n exitCode: result.exitCode,\n timestamp: Date.now(),\n },\n ]);\n } catch (err: any) {\n setTerminalHistory((prev) => [\n ...prev,\n {\n id: `${Date.now()}`,\n command: cmd,\n output: err.message,\n exitCode: 1,\n timestamp: Date.now(),\n },\n ]);\n } finally {\n setTerminalLoading(false);\n termInputRef.current?.focus();\n }\n }\n\n function handleTerminalKeyDown(e: React.KeyboardEvent) {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleTerminalExec();\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n if (cmdHistory.length > 0) {\n const newIdx = cmdHistoryIdx < 0 ? cmdHistory.length - 1 : Math.max(0, cmdHistoryIdx - 1);\n setCmdHistoryIdx(newIdx);\n setTerminalInput(cmdHistory[newIdx]);\n }\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n if (cmdHistoryIdx >= 0) {\n const newIdx = cmdHistoryIdx + 1;\n if (newIdx >= cmdHistory.length) {\n setCmdHistoryIdx(-1);\n setTerminalInput(\"\");\n } else {\n setCmdHistoryIdx(newIdx);\n setTerminalInput(cmdHistory[newIdx]);\n }\n }\n }\n }\n\n async function handleChatSend() {\n const content = chatInput.trim();\n if (!content || isBusy) return;\n setChatInput(\"\");\n\n let threadId = activeThreadId;\n if (!threadId) {\n threadId = `web:${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n setActiveThread(threadId);\n }\n\n addMessage({\n id: crypto.randomUUID(),\n role: \"user\",\n content,\n timestamp: new Date().toISOString(),\n });\n setWaiting(true);\n\n api.chat.threads.addMessage(threadId, \"user\", content)\n .then(() => bumpThreadVersion())\n .catch(() => {});\n\n try {\n await api.chat.send(content, threadId);\n } catch {\n setWaiting(false);\n clearStreaming();\n }\n }\n\n // Get last few messages for the chat feed\n const recentMessages = messages.slice(-6);\n\n return (\n <div className=\"flex h-full flex-col\">\n {/* Status bar */}\n <div className=\"flex items-center gap-2 border-b border-border bg-muted/20 px-3 py-1 text-[11px]\">\n {/* Mode indicator */}\n <div className=\"flex items-center gap-1.5\">\n {codeMode?.active ? (\n <Badge\n variant=\"outline\"\n className={cn(\n \"text-[10px] px-1.5 py-0 gap-1\",\n codeMode.state === \"execute\"\n ? \"border-emerald-500/40 text-emerald-400\"\n : \"border-amber-500/40 text-amber-400\"\n )}\n >\n <Zap className=\"h-2.5 w-2.5\" />\n {codeMode.state === \"execute\" ? \"Execute\" : \"Plan\"}\n </Badge>\n ) : (\n <Badge variant=\"outline\" className=\"text-[10px] px-1.5 py-0 text-muted-foreground\">\n Chat\n </Badge>\n )}\n </div>\n\n <span className=\"h-3 w-px bg-border\" />\n\n {/* Project info */}\n {projectInfo && (\n <>\n <span className=\"text-muted-foreground font-mono truncate max-w-[200px]\">\n {projectInfo.projectName}\n </span>\n <span className=\"h-3 w-px bg-border\" />\n <span className=\"text-muted-foreground font-mono truncate max-w-[300px]\" title={projectInfo.cwd}>\n {projectInfo.cwd}\n </span>\n {projectInfo.isGit && (\n <>\n <span className=\"h-3 w-px bg-border\" />\n <div className=\"flex items-center gap-1 text-muted-foreground\">\n <GitBranch className=\"h-3 w-3\" />\n <span className=\"font-mono\">{projectInfo.branch}</span>\n </div>\n </>\n )}\n </>\n )}\n\n <span className=\"flex-1\" />\n\n {/* Connection indicator */}\n <div className=\"flex items-center gap-1 text-muted-foreground\">\n <div className={cn(\"h-1.5 w-1.5 rounded-full\", connected ? \"bg-emerald-500\" : \"bg-red-500\")} />\n <span>{connected ? \"Connected\" : \"Disconnected\"}</span>\n </div>\n </div>\n\n {/* Tab headers */}\n <div className=\"flex items-center justify-between border-b border-border bg-muted/10\">\n <div className=\"flex items-center\">\n <button\n onClick={() => setActiveBottomTab(\"terminal\")}\n className={cn(\n \"flex items-center gap-1.5 px-4 py-1.5 text-xs font-medium transition-colors border-b-2\",\n activeBottomTab === \"terminal\"\n ? \"border-b-primary text-foreground\"\n : \"border-b-transparent text-muted-foreground hover:text-foreground\"\n )}\n >\n <TerminalIcon className=\"h-3.5 w-3.5\" />\n Terminal\n </button>\n <button\n onClick={() => setActiveBottomTab(\"chat\")}\n className={cn(\n \"flex items-center gap-1.5 px-4 py-1.5 text-xs font-medium transition-colors border-b-2\",\n activeBottomTab === \"chat\"\n ? \"border-b-primary text-foreground\"\n : \"border-b-transparent text-muted-foreground hover:text-foreground\"\n )}\n >\n <MessageSquare className=\"h-3.5 w-3.5\" />\n Chat\n {isBusy && <Loader2 className=\"h-3 w-3 animate-spin text-primary\" />}\n </button>\n </div>\n <button\n onClick={onToggleMaximize}\n className=\"mr-2 rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground\"\n title={isMaximized ? \"Restore panel\" : \"Maximize panel\"}\n aria-label={isMaximized ? \"Restore panel\" : \"Maximize panel\"}\n >\n {isMaximized ? (\n <Minimize2 className=\"h-3.5 w-3.5\" />\n ) : (\n <Maximize2 className=\"h-3.5 w-3.5\" />\n )}\n </button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-h-0 overflow-hidden\">\n {activeBottomTab === \"terminal\" ? (\n <div className=\"flex h-full flex-col bg-[#0d1117]\">\n <div ref={terminalRef} className=\"flex-1 overflow-auto p-2 font-mono text-[13px]\">\n {terminalHistory.map((entry) => (\n <div key={entry.id} className=\"mb-2\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-emerald-400\">$</span>\n <span className=\"text-gray-200\">{entry.command}</span>\n </div>\n {entry.output && (\n <pre className={cn(\n \"whitespace-pre-wrap text-[12px] leading-relaxed mt-0.5 pl-4\",\n entry.exitCode === 0 ? \"text-gray-400\" : \"text-red-400\"\n )}>\n {entry.output}\n </pre>\n )}\n </div>\n ))}\n {terminalLoading && (\n <div className=\"flex items-center gap-2 text-gray-500\">\n <Loader2 className=\"h-3 w-3 animate-spin\" />\n <span className=\"text-xs\">Running...</span>\n </div>\n )}\n </div>\n\n {/* Terminal input */}\n <div className=\"flex items-center gap-2 border-t border-gray-800 bg-[#0d1117] px-3 py-2\">\n <span className=\"text-emerald-400 font-mono text-sm\">$</span>\n <input\n ref={termInputRef}\n value={terminalInput}\n onChange={(e) => setTerminalInput(e.target.value)}\n onKeyDown={handleTerminalKeyDown}\n placeholder=\"Type a command...\"\n className=\"flex-1 bg-transparent font-mono text-[13px] text-gray-200 placeholder:text-gray-600 focus:outline-none\"\n autoFocus\n />\n </div>\n </div>\n ) : (\n <div className=\"flex h-full flex-col\">\n {/* Chat messages feed */}\n <ScrollArea className=\"flex-1 px-3 py-2\">\n <div className=\"space-y-2\">\n {recentMessages.map((msg) => (\n <div\n key={msg.id}\n className={cn(\n \"rounded-lg px-3 py-2 text-sm\",\n msg.role === \"user\"\n ? \"bg-primary/10 text-foreground ml-8\"\n : msg.role === \"system\"\n ? \"bg-red-500/10 text-red-400\"\n : \"bg-muted text-foreground mr-8\"\n )}\n >\n {msg.role === \"assistant\" ? (\n <MarkdownRenderer content={msg.content} />\n ) : (\n <p className=\"whitespace-pre-wrap text-[13px]\">{msg.content}</p>\n )}\n </div>\n ))}\n {isStreaming && streamingText && (\n <div className=\"rounded-lg bg-muted px-3 py-2 mr-8\">\n <MarkdownRenderer content={streamingText} />\n <span className=\"inline-block h-3.5 w-[2px] animate-pulse bg-primary ml-0.5\" />\n </div>\n )}\n {waiting && !isStreaming && (\n <div className=\"flex items-center gap-2 rounded-lg bg-muted px-3 py-2 text-sm text-muted-foreground mr-8\">\n <Loader2 className=\"h-3.5 w-3.5 animate-spin text-primary\" />\n Thinking...\n </div>\n )}\n </div>\n </ScrollArea>\n\n {/* Chat input */}\n <div className=\"flex items-center gap-2 border-t border-border px-3 py-2\">\n <input\n value={chatInput}\n onChange={(e) => setChatInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleChatSend();\n }\n }}\n placeholder=\"Ask Mercury...\"\n disabled={isBusy}\n className={cn(\n \"flex-1 bg-transparent text-sm text-foreground placeholder:text-muted-foreground/60 focus:outline-none\",\n isBusy && \"opacity-50\"\n )}\n />\n <Button\n size=\"icon\"\n className=\"h-7 w-7 shrink-0\"\n disabled={isBusy || !chatInput.trim()}\n onClick={handleChatSend}\n >\n <Send className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n\n// ═══════════════════════════════════════════════════════════════\n// Main Workspace Page\n// ═══════════════════════════════════════════════════════════════\n\nexport function WorkspacePage() {\n const [tabs, setTabs] = useState<OpenTab[]>([]);\n const [activeTab, setActiveTab] = useState<string | null>(null);\n const [projectInfo, setProjectInfo] = useState<WorkspaceInfo | null>(null);\n const [codeMode, setCodeMode] = useState<{ state: string; active: boolean } | null>(null);\n const [leftWidth, setLeftWidth] = useState(240);\n const [rightWidth, setRightWidth] = useState(280);\n const [bottomHeight, setBottomHeight] = useState(260);\n const [bottomMaximized, setBottomMaximized] = useState(false);\n const [showLeft, setShowLeft] = useState(true);\n const [showRight, setShowRight] = useState(true);\n const [showFolderPicker, setShowFolderPicker] = useState(false);\n const [folderInput, setFolderInput] = useState(\"\");\n const [folderError, setFolderError] = useState(\"\");\n const [folderLoading, setFolderLoading] = useState(false);\n const [workspaceKey, setWorkspaceKey] = useState(0);\n\n // Load project info and code mode\n useEffect(() => {\n api.workspace.info().then(setProjectInfo).catch(() => {});\n api.code.status().then((s) => setCodeMode({ state: s.state, active: s.active })).catch(() => {});\n }, []);\n\n async function handleChangeWorkspace() {\n const path = folderInput.trim();\n if (!path) return;\n setFolderLoading(true);\n setFolderError(\"\");\n try {\n await api.workspace.setRoot(path);\n const info = await api.workspace.info();\n setProjectInfo(info);\n setShowFolderPicker(false);\n setFolderInput(\"\");\n // Reset all panels and close all tabs\n setTabs([]);\n setActiveTab(null);\n setWorkspaceKey((k) => k + 1);\n } catch (err: any) {\n setFolderError(err.message || \"Invalid path\");\n } finally {\n setFolderLoading(false);\n }\n }\n\n // Open a file in a tab\n async function openFile(path: string) {\n // Check if already open\n const existing = tabs.find((t) => t.path === path);\n if (existing) {\n setActiveTab(path);\n return;\n }\n\n try {\n const file = await api.workspace.file(path);\n const ext = file.ext || (path.includes(\".\") ? \".\" + path.split(\".\").pop()! : \"\");\n const newTab: OpenTab = {\n path,\n name: file.name,\n content: file.content,\n language: extToLanguage(ext),\n dirty: false,\n originalContent: file.content,\n };\n setTabs((prev) => [...prev, newTab]);\n setActiveTab(path);\n } catch {\n // Could not open file\n }\n }\n\n function closeTab(path: string) {\n setTabs((prev) => prev.filter((t) => t.path !== path));\n if (activeTab === path) {\n const remaining = tabs.filter((t) => t.path !== path);\n setActiveTab(remaining.length > 0 ? remaining[remaining.length - 1].path : null);\n }\n }\n\n async function saveTab(path: string) {\n const tab = tabs.find((t) => t.path === path);\n if (!tab || !tab.dirty) return;\n\n try {\n await api.workspace.saveFile(path, tab.content);\n setTabs((prev) =>\n prev.map((t) =>\n t.path === path\n ? { ...t, dirty: false, originalContent: t.content }\n : t\n )\n );\n } catch {\n // Save failed\n }\n }\n\n function updateTabContent(path: string, content: string) {\n setTabs((prev) =>\n prev.map((t) =>\n t.path === path\n ? { ...t, content, dirty: content !== t.originalContent }\n : t\n )\n );\n }\n\n // Resizer handlers\n function useResizer(\n direction: \"horizontal\" | \"vertical\",\n setValue: React.Dispatch<React.SetStateAction<number>>,\n min: number,\n max: number,\n invert: boolean = false\n ) {\n const dragging = useRef(false);\n\n const onMouseDown = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n dragging.current = true;\n const startPos = direction === \"horizontal\" ? e.clientX : e.clientY;\n let currentValue: number;\n setValue((v) => { currentValue = v; return v; });\n\n function onMouseMove(e2: MouseEvent) {\n if (!dragging.current) return;\n const rawDelta = direction === \"horizontal\"\n ? e2.clientX - startPos\n : startPos - e2.clientY; // inverted for bottom panel\n const delta = invert ? -rawDelta : rawDelta;\n setValue(Math.min(max, Math.max(min, currentValue! + delta)));\n }\n\n function onMouseUp() {\n dragging.current = false;\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n }\n\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n }, [direction, setValue, min, max, invert]);\n\n return { onMouseDown };\n }\n\n const leftResizer = useResizer(\"horizontal\", setLeftWidth, 160, 400);\n // Right panel's resizer sits on its LEFT edge, so mouse delta is inverted\n const rightResizer = useResizer(\"horizontal\", setRightWidth, 200, 450, true);\n const bottomResizer = useResizer(\"vertical\", setBottomHeight, 120, 500);\n\n return (\n <div className=\"flex h-full w-full flex-col overflow-hidden bg-background\">\n {/* Workspace header bar */}\n <div className=\"flex items-center gap-3 border-b border-border bg-muted/20 px-4 py-1.5\">\n <div className=\"flex items-center gap-2 text-sm\">\n <FolderInput className=\"h-4 w-4 text-mercury-400\" />\n <span className=\"font-medium text-foreground\">\n {projectInfo?.projectName || \"Workspace\"}\n </span>\n <span className=\"text-xs text-muted-foreground font-mono truncate max-w-[300px]\" title={projectInfo?.cwd}>\n {projectInfo?.cwd || \"—\"}\n </span>\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 gap-1 px-2 text-xs text-muted-foreground hover:text-foreground\"\n onClick={() => { setShowFolderPicker(!showFolderPicker); setFolderInput(projectInfo?.cwd || \"\"); setFolderError(\"\"); }}\n >\n Change Folder\n </Button>\n <span className=\"flex-1\" />\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-2 text-xs\"\n onClick={() => setShowLeft(!showLeft)}\n >\n {showLeft ? \"Hide Explorer\" : \"Show Explorer\"}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-2 text-xs\"\n onClick={() => setShowRight(!showRight)}\n >\n {showRight ? \"Hide Git\" : \"Show Git\"}\n </Button>\n </div>\n\n {/* Folder picker dropdown */}\n <AnimatePresence>\n {showFolderPicker && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n className=\"overflow-hidden border-b border-border\"\n >\n <div className=\"flex items-center gap-2 bg-muted/10 px-4 py-2\">\n <input\n value={folderInput}\n onChange={(e) => { setFolderInput(e.target.value); setFolderError(\"\"); }}\n onKeyDown={(e) => { if (e.key === \"Enter\") handleChangeWorkspace(); if (e.key === \"Escape\") setShowFolderPicker(false); }}\n placeholder=\"/path/to/project\"\n className=\"flex-1 rounded-md border border-border bg-background px-3 py-1.5 text-sm font-mono text-foreground placeholder:text-muted-foreground/50 focus:outline-none focus:ring-1 focus:ring-primary/40\"\n autoFocus\n />\n <Button\n size=\"sm\"\n className=\"h-7 gap-1 text-xs\"\n onClick={handleChangeWorkspace}\n disabled={folderLoading || !folderInput.trim()}\n >\n {folderLoading ? <Loader2 className=\"h-3 w-3 animate-spin\" /> : <Check className=\"h-3 w-3\" />}\n Open\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-7 text-xs\"\n onClick={() => setShowFolderPicker(false)}\n >\n Cancel\n </Button>\n </div>\n {folderError && (\n <p className=\"px-4 pb-2 text-xs text-red-400\">{folderError}</p>\n )}\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Main content area (horizontal split) */}\n {!bottomMaximized && (\n <div className=\"flex flex-1 min-h-0 overflow-hidden\">\n {/* Left Panel — File Explorer */}\n {showLeft && (\n <>\n <div style={{ width: leftWidth }} className=\"shrink-0 overflow-hidden border-r border-border\">\n <FileExplorer key={workspaceKey} onOpenFile={openFile} openFiles={tabs.map((t) => t.path)} />\n </div>\n {/* Left resizer */}\n <div\n {...leftResizer}\n className=\"w-1 shrink-0 cursor-col-resize hover:bg-primary/30 active:bg-primary/50 transition-colors\"\n />\n </>\n )}\n\n {/* Center Panel — Editor Tabs */}\n <div className=\"flex-1 min-w-0 overflow-hidden\">\n <EditorPanel\n tabs={tabs}\n activeTab={activeTab}\n onSelectTab={setActiveTab}\n onCloseTab={closeTab}\n onSave={saveTab}\n onContentChange={updateTabContent}\n />\n </div>\n\n {/* Right resizer */}\n {showRight && (\n <div\n {...rightResizer}\n className=\"w-1 shrink-0 cursor-col-resize hover:bg-primary/30 active:bg-primary/50 transition-colors\"\n />\n )}\n\n {/* Right Panel — Git */}\n {showRight && (\n <div style={{ width: rightWidth }} className=\"shrink-0 overflow-hidden border-l border-border\">\n <GitPanel key={workspaceKey} />\n </div>\n )}\n </div>\n )}\n\n {/* Bottom resizer (hidden when maximized) */}\n {!bottomMaximized && (\n <div\n {...bottomResizer}\n className=\"h-1 shrink-0 cursor-row-resize hover:bg-primary/30 active:bg-primary/50 transition-colors border-t border-border\"\n />\n )}\n\n {/* Bottom Panel — Terminal + Chat */}\n <div\n style={bottomMaximized ? undefined : { height: bottomHeight }}\n className={cn(\n \"overflow-hidden\",\n bottomMaximized ? \"flex-1 min-h-0\" : \"shrink-0\"\n )}\n >\n <BottomPanel\n projectInfo={projectInfo}\n codeMode={codeMode}\n isMaximized={bottomMaximized}\n onToggleMaximize={() => setBottomMaximized((v) => !v)}\n />\n </div>\n </div>\n );\n}\n"],"names":["__iconNode","Circle","createLucideIcon","FileCode","FolderInput","FolderTree","GitCommitHorizontal","Maximize2","Minimize2","Minus","RefreshCw","Upload","extToLanguage","ext","fileIcon","name","isDir","isOpen","FolderOpen","jsx","Folder","FileText","statusIcon","status","FileExplorer","onOpenFile","openFiles","tree","setTree","useState","expandedDirs","setExpandedDirs","dirContents","setDirContents","loading","setLoading","useEffect","loadDir","path","data","api","prev","toggleDir","next","renderItems","items","parentPath","item","fullPath","isExpanded","subTree","jsxs","cn","ChevronDown","ChevronRight","Loader2","Button","ScrollArea","EditorPanel","tabs","activeTab","onSelectTab","onCloseTab","onSave","onContentChange","textareaRef","useRef","scrollRef","current","t","handleKey","e","tab","X","Badge","_a","SyntaxHighlighter","oneDark","GitPanel","gitStatus","setGitStatus","branches","setBranches","commits","setCommits","commitMsg","setCommitMsg","showBranches","setShowBranches","showLog","setShowLog","refreshing","setRefreshing","actionLoading","setActionLoading","feedback","setFeedback","refresh","useCallback","showToast","statusData","branchData","logData","err","showFeedbackMsg","type","msg","handleStage","files","handleUnstage","handleCommit","result","handlePush","handlePull","handleCheckout","branch","handleGenerateMessage","f","stagedFiles","unstagedFiles","GitBranch","Download","AnimatePresence","motion","ArrowUp","ArrowDown","b","Check","Sparkles","Plus","commit","GitCommitIcon","BottomPanel","projectInfo","codeMode","isMaximized","onToggleMaximize","activeBottomTab","setActiveBottomTab","terminalHistory","setTerminalHistory","terminalInput","setTerminalInput","terminalLoading","setTerminalLoading","cmdHistory","setCmdHistory","cmdHistoryIdx","setCmdHistoryIdx","terminalRef","termInputRef","chatInput","setChatInput","connected","useSSE","streamingText","useChatStore","isStreaming","waiting","messages","addMessage","setWaiting","clearStreaming","activeThreadId","setActiveThread","bumpThreadVersion","isBusy","handleTerminalExec","cmd","handleTerminalKeyDown","newIdx","handleChatSend","content","threadId","recentMessages","Zap","Fragment","TerminalIcon","MessageSquare","entry","MarkdownRenderer","Send","WorkspacePage","setTabs","setActiveTab","setProjectInfo","setCodeMode","leftWidth","setLeftWidth","rightWidth","setRightWidth","bottomHeight","setBottomHeight","bottomMaximized","setBottomMaximized","showLeft","setShowLeft","showRight","setShowRight","showFolderPicker","setShowFolderPicker","folderInput","setFolderInput","folderError","setFolderError","folderLoading","setFolderLoading","workspaceKey","setWorkspaceKey","s","handleChangeWorkspace","info","k","openFile","file","newTab","closeTab","remaining","saveTab","updateTabContent","useResizer","direction","setValue","min","max","invert","dragging","startPos","currentValue","v","onMouseMove","e2","rawDelta","delta","onMouseUp","leftResizer","rightResizer","bottomResizer"],"mappings":"4/BAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,GAAa,CAAC,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,QAAQ,CAAE,CAAC,EACxEC,GAASC,EAAiB,SAAUF,EAAU,ECVpD;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,GAAa,CACjB,CAAC,OAAQ,CAAE,EAAG,sBAAuB,IAAK,QAAQ,CAAE,EACpD,CAAC,OAAQ,CAAE,EAAG,uBAAwB,IAAK,QAAQ,CAAE,EACrD,CAAC,OAAQ,CAAE,EAAG,0BAA2B,IAAK,QAAQ,CAAE,EACxD,CAAC,OAAQ,CAAE,EAAG,6DAA8D,IAAK,QAAQ,CAAE,CAC7F,EACMG,GAAWD,EAAiB,YAAaF,EAAU,ECfzD;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,GAAa,CACjB,CACE,OACA,CACE,EAAG,0HACH,IAAK,QACX,CACA,EACE,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,EACzC,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,CAChD,EACMI,GAAcF,EAAiB,eAAgBF,EAAU,ECpB/D;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,GAAa,CACjB,CACE,OACA,CACE,EAAG,qHACH,IAAK,QACX,CACA,EACE,CACE,OACA,CACE,EAAG,2HACH,IAAK,QACX,CACA,EACE,CAAC,OAAQ,CAAE,EAAG,uBAAwB,IAAK,QAAQ,CAAE,EACrD,CAAC,OAAQ,CAAE,EAAG,0BAA2B,IAAK,QAAQ,CAAE,CAC1D,EACMK,GAAaH,EAAiB,cAAeF,EAAU,EC3B7D;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,GAAa,CACjB,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,IAAK,IAAK,SAAU,EACxD,CAAC,OAAQ,CAAE,GAAI,IAAK,GAAI,IAAK,GAAI,KAAM,GAAI,KAAM,IAAK,QAAQ,CAAE,EAChE,CAAC,OAAQ,CAAE,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,IAAK,QAAQ,CAAE,CACpE,EACMM,GAAsBJ,EAAiB,wBAAyBF,EAAU,ECdhF;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,GAAa,CACjB,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,EAC1C,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,EAC1C,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,EAC1C,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAQ,CAAE,CAC7C,EACMO,GAAYL,EAAiB,aAAcF,EAAU,ECf3D;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,GAAa,CACjB,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAQ,CAAE,EAC3C,CAAC,OAAQ,CAAE,EAAG,cAAe,IAAK,QAAQ,CAAE,EAC5C,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,EAC1C,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,CAC5C,EACMQ,GAAYN,EAAiB,aAAcF,EAAU,ECf3D;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,GAAa,CAAC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,CAAC,EACxDS,GAAQP,EAAiB,QAASF,EAAU,ECVlD;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,GAAa,CACjB,CAAC,OAAQ,CAAE,EAAG,qDAAsD,IAAK,QAAQ,CAAE,EACnF,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAQ,CAAE,EAC3C,CAAC,OAAQ,CAAE,EAAG,sDAAuD,IAAK,QAAQ,CAAE,EACpF,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,CAC5C,EACMU,GAAYR,EAAiB,aAAcF,EAAU,ECf3D;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,GAAa,CACjB,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,EACzC,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,EAC9C,CAAC,OAAQ,CAAE,EAAG,4CAA6C,IAAK,QAAQ,CAAE,CAC5E,EACMW,GAAST,EAAiB,SAAUF,EAAU,ECuEpD,SAASY,GAAcC,EAAqB,CAe1C,MAdoC,CAClC,MAAO,aAAc,OAAQ,MAAO,MAAO,aAAc,OAAQ,MACjE,MAAO,SAAU,MAAO,OAAQ,MAAO,KAAM,QAAS,OACtD,QAAS,OAAQ,QAAS,OAAQ,OAAQ,OAAQ,QAAS,OAC3D,MAAO,WAAY,OAAQ,OAAQ,OAAQ,MAAO,QAAS,OAC3D,MAAO,OAAQ,QAAS,OAAQ,OAAQ,OAAQ,OAAQ,MACxD,OAAQ,MAAO,OAAQ,MAAO,cAAe,SAC7C,OAAQ,OAAQ,aAAc,OAAQ,KAAM,IAAK,OAAQ,MACzD,KAAM,IAAK,OAAQ,MAAO,MAAO,OAAQ,OAAQ,MACjD,SAAU,QAAS,MAAO,SAAU,SAAU,QAC9C,OAAQ,MAAO,KAAM,IAAK,QAAS,OAAQ,WAAY,UACvD,QAAS,OAAQ,QAAS,OAAQ,OAAQ,SAC1C,UAAW,OAAQ,SAAU,UAAA,EAEpBA,EAAI,YAAA,CAAa,GAAK,MACnC,CAEA,SAASC,GAASC,EAAcC,EAAgBC,EAAkB,CAChE,GAAID,EACF,OAAOC,QACFC,GAAA,CAAW,UAAU,2BAA2B,EACjDC,EAAAA,IAACC,GAAA,CAAO,UAAU,6BAAA,CAA8B,EAEtD,MAAMP,EAAME,EAAK,SAAS,GAAG,EAAI,IAAMA,EAAK,MAAM,GAAG,EAAE,IAAA,EAAS,GAEhE,MADiB,CAAC,MAAO,OAAQ,MAAO,OAAQ,MAAO,MAAO,MAAO,QAAS,KAAK,EACtE,SAASF,CAAG,EAAUM,EAAAA,IAAChB,GAAA,CAAS,UAAU,wBAAwB,EACxEgB,EAAAA,IAACE,GAAA,CAAS,UAAU,+BAAA,CAAgC,CAC7D,CAaA,SAASC,GAAWC,EAAgB,CAClC,OAAQA,EAAA,CACN,IAAK,WAAY,OAAOJ,EAAAA,IAAC,OAAA,CAAK,UAAU,mCAAmC,SAAA,IAAC,EAC5E,IAAK,QAAS,OAAOA,EAAAA,IAAC,OAAA,CAAK,UAAU,qCAAqC,SAAA,IAAC,EAC3E,IAAK,UAAW,OAAOA,EAAAA,IAAC,OAAA,CAAK,UAAU,iCAAiC,SAAA,IAAC,EACzE,IAAK,YAAa,OAAOA,EAAAA,IAAC,OAAA,CAAK,UAAU,kCAAkC,SAAA,IAAC,EAC5E,IAAK,UAAW,OAAOA,EAAAA,IAAC,OAAA,CAAK,UAAU,oCAAoC,SAAA,IAAC,EAC5E,QAAS,OAAOA,EAAAA,IAAC,OAAA,CAAK,UAAU,gCAAgC,SAAA,IAAC,CAAA,CAErE,CAMA,SAASK,GAAa,CACpB,WAAAC,EACA,UAAAC,CACF,EAGG,CACD,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAA+B,IAAI,EACrD,CAACC,EAAcC,CAAe,EAAIF,EAAAA,aAA0B,IAAI,CAAC,GAAG,CAAC,CAAC,EACtE,CAACG,EAAaC,CAAc,EAAIJ,EAAAA,SAAqC,IAAI,GAAK,EAC9E,CAACK,EAASC,CAAU,EAAIN,EAAAA,SAAS,EAAI,EAE3CO,EAAAA,UAAU,IAAM,CACdC,EAAA,CACF,EAAG,CAAA,CAAE,EAEL,eAAeA,EAAQC,EAAe,CACpC,GAAI,CACF,MAAMC,EAAO,MAAMC,EAAI,UAAU,KAAKF,CAAI,EACtC,CAACA,GAAQA,IAAS,KACpBV,EAAQW,CAAI,EACZJ,EAAW,EAAK,GAEhBF,EAAgBQ,GAAS,IAAI,IAAIA,CAAI,EAAE,IAAIH,EAAMC,CAAI,CAAC,CAE1D,MAAQ,CACNJ,EAAW,EAAK,CAClB,CACF,CAEA,SAASO,EAAUJ,EAAc,CAC/B,MAAMK,EAAO,IAAI,IAAIb,CAAY,EAC7Ba,EAAK,IAAIL,CAAI,EACfK,EAAK,OAAOL,CAAI,GAEhBK,EAAK,IAAIL,CAAI,EACRN,EAAY,IAAIM,CAAI,GACvBD,EAAQC,CAAI,GAGhBP,EAAgBY,CAAI,CACtB,CAEA,SAASC,EAAYC,EAA+BC,EAAoB,CACtE,OAAOD,EAAM,IAAKE,GAAS,CACzB,MAAMC,EAAWF,IAAe,IAAMC,EAAK,KAAO,GAAGD,CAAU,IAAIC,EAAK,IAAI,GACtEE,EAAanB,EAAa,IAAIkB,CAAQ,EACtC/B,EAASS,EAAU,SAASsB,CAAQ,EAE1C,GAAID,EAAK,YAAa,CACpB,MAAMG,EAAUlB,EAAY,IAAIgB,CAAQ,EACxC,cACG,MAAA,CACC,SAAA,CAAAG,EAAAA,KAAC,SAAA,CACC,QAAS,IAAMT,EAAUM,CAAQ,EACjC,UAAWI,EACT,gGACA,mBAAA,EAGD,SAAA,CAAAH,EACG9B,EAAAA,IAACkC,IAAY,UAAU,wCAAA,CAAyC,EAChElC,EAAAA,IAACmC,GAAA,CAAa,UAAU,wCAAA,CAAyC,EAEpExC,GAASiC,EAAK,KAAM,GAAME,CAAU,EACrC9B,EAAAA,IAAC,OAAA,CAAK,UAAU,WAAY,WAAK,IAAA,CAAK,CAAA,CAAA,CAAA,EAEvC8B,GAAcC,GACb/B,MAAC,MAAA,CAAI,UAAU,sCACZ,SAAAyB,EAAYM,EAAQ,MAAOF,CAAQ,CAAA,CACtC,CAAA,CAAA,EAlBMA,CAoBV,CAEJ,CAEA,OACEG,EAAAA,KAAC,SAAA,CAEC,QAAS,IAAM1B,EAAWuB,CAAQ,EAClC,UAAWI,EACT,gGACAnC,EACI,6BACA,sCAAA,EAGN,SAAA,CAAAE,EAAAA,IAAC,OAAA,CAAK,UAAU,KAAA,CAAM,EACrBL,GAASiC,EAAK,KAAM,EAAK,EAC1B5B,EAAAA,IAAC,OAAA,CAAK,UAAU,WAAY,WAAK,IAAA,CAAK,CAAA,CAAA,EAXjC6B,CAAA,CAcX,CAAC,CACH,CAEA,OAAId,EAEAf,MAAC,OAAI,UAAU,yCACb,eAACoC,EAAA,CAAQ,UAAU,oCAAoC,CAAA,CACzD,EAKFJ,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,qEACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAhC,EAAAA,IAACd,GAAA,CAAW,UAAU,0BAAA,CAA2B,EACjDc,EAAAA,IAAC,OAAA,CAAK,UAAU,uEAAuE,SAAA,UAAA,CAEvF,CAAA,EACF,QACCqC,EAAA,CAAO,QAAQ,QAAQ,KAAK,OAAO,UAAU,UAAU,QAAS,IAAMnB,IACrE,SAAAlB,EAAAA,IAACT,GAAA,CAAU,UAAU,UAAU,CAAA,CACjC,CAAA,EACF,EACAS,EAAAA,IAACsC,IAAW,UAAU,mBACnB,YAAQb,EAAYjB,EAAK,MAAO,GAAG,CAAA,CACtC,CAAA,EACF,CAEJ,CAMA,SAAS+B,GAAY,CACnB,KAAAC,EACA,UAAAC,EACA,YAAAC,EACA,WAAAC,EACA,OAAAC,EACA,gBAAAC,CACF,EAOG,CACD,MAAMC,EAAcC,EAAAA,OAA4B,IAAI,EAC9CC,EAAYD,EAAAA,OAAuB,IAAI,EACvCE,EAAUT,EAAK,KAAMU,GAAMA,EAAE,OAAST,CAAS,EAcrD,OAXAxB,EAAAA,UAAU,IAAM,CACd,SAASkC,EAAUC,EAAkB,EAC9BA,EAAE,SAAWA,EAAE,UAAYA,EAAE,MAAQ,MACxCA,EAAE,eAAA,EACEX,KAAkBA,CAAS,EAEnC,CACA,cAAO,iBAAiB,UAAWU,CAAS,EACrC,IAAM,OAAO,oBAAoB,UAAWA,CAAS,CAC9D,EAAG,CAACV,EAAWG,CAAM,CAAC,EAElBJ,EAAK,SAAW,EAEhBR,EAAAA,KAAC,MAAA,CAAI,UAAU,qEACb,SAAA,CAAAhC,EAAAA,IAAC,OAAI,UAAU,gCACb,eAAChB,GAAA,CAAS,UAAU,4BAA4B,CAAA,CAClD,SACC,MAAA,CACC,SAAA,CAAAgB,EAAAA,IAAC,KAAA,CAAG,UAAU,0CAA0C,SAAA,gBAAa,EACrEA,EAAAA,IAAC,IAAA,CAAE,UAAU,qCAAqC,SAAA,kDAAA,CAElD,CAAA,CAAA,CACF,CAAA,EACF,EAKFgC,EAAAA,KAAC,MAAA,CAAI,UAAU,uBAEb,SAAA,CAAAhC,MAAC,OAAI,UAAU,6EACZ,SAAAwC,EAAK,IAAKa,GACTrB,EAAAA,KAAC,SAAA,CAEC,QAAS,IAAMU,EAAYW,EAAI,IAAI,EACnC,UAAWpB,EACT,oGACAoB,EAAI,OAASZ,EACT,4DACA,+DAAA,EAGL,SAAA,CAAA9C,GAAS0D,EAAI,KAAM,EAAK,EACzBrD,EAAAA,IAAC,OAAA,CAAK,UAAU,yBAA0B,WAAI,KAAK,EAClDqD,EAAI,OACHrD,EAAAA,IAAClB,GAAA,CAAO,UAAU,oCAAoC,EAExDkB,EAAAA,IAAC,SAAA,CACC,QAAUoD,GAAM,CAAEA,EAAE,gBAAA,EAAmBT,EAAWU,EAAI,IAAI,CAAG,EAC7D,UAAU,yFAEV,SAAArD,EAAAA,IAACsD,GAAA,CAAE,UAAU,SAAA,CAAU,CAAA,CAAA,CACzB,CAAA,EAnBKD,EAAI,IAAA,CAqBZ,EACH,EAGCJ,GACCjB,EAAAA,KAAC,MAAA,CAAI,UAAU,wCAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,oFACb,SAAA,CAAAhC,EAAAA,IAAC,OAAA,CAAK,UAAU,0CAA2C,SAAAiD,EAAQ,KAAK,EACxEjB,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAhC,MAACuD,GAAM,QAAQ,UAAU,UAAU,0BAChC,WAAQ,SACX,EACCN,EAAQ,OACPjB,OAACK,EAAA,CAAO,KAAK,KAAK,QAAQ,QAAQ,UAAU,6BAA6B,QAAS,IAAMO,EAAOK,EAAQ,IAAI,EACzG,SAAA,CAAAjD,EAAAA,IAAC,OAAA,CAAK,UAAU,eAAe,SAAA,OAAI,EACnCA,EAAAA,IAAC,OAAA,CAAK,UAAU,wBAAwB,SAAA,OAAA,CAAK,CAAA,CAAA,CAC/C,CAAA,CAAA,CAEJ,CAAA,EACF,EAGAA,MAAC,OAAI,UAAU,4CAA4C,IAAKgD,EAAW,QAAS,WAAM,OAAAQ,EAAAV,EAAY,UAAZ,YAAAU,EAAqB,SAC7G,SAAAxB,EAAAA,KAAC,OAAI,UAAU,WAAW,MAAO,CAAE,SAAU,eAE3C,SAAA,CAAAhC,EAAAA,IAACyD,GAAA,CACC,SAAUR,EAAQ,SAClB,MAAOS,GACP,gBAAe,GACf,gBAAiB,CACf,SAAU,MACV,aAAc,MACd,MAAO,yBACP,SAAU,OACV,WAAY,OACZ,WAAY,MAAA,EAEd,YAAa,CACX,OAAQ,EACR,QAAS,WACT,WAAY,cACZ,SAAU,OACV,WAAY,OACZ,WAAY,yDAAA,EAEd,aAAc,CACZ,MAAO,CACL,SAAU,OACV,WAAY,OACZ,WAAY,yDAAA,CACd,EAEF,cAAe,GAEd,WAAQ,SAAW,GAAA,CAAA,EAGtB1D,EAAAA,IAAC,WAAA,CACC,IAAK8C,EACL,MAAOG,EAAQ,QACf,SAAWG,GAAMP,EAAgBI,EAAQ,KAAMG,EAAE,OAAO,KAAK,EAC7D,WAAY,GACZ,UAAWnB,EACT,8FACA,uCACA,qBACA,iBACA,+CAAA,EAEF,MAAO,CACL,QAAS,EACT,QAAS,wBACT,WAAY,0DACZ,SAAU,QAAA,EAEZ,QAAS,IAAM,CAETa,EAAY,UACdA,EAAY,QAAQ,MAAM,cAAgB,OAE9C,EACA,OAAQ,IAAM,CAERA,EAAY,UACdA,EAAY,QAAQ,MAAM,cAAgB,OAE9C,EACA,QAAUM,GAAM,CAEVJ,EAAU,UACZA,EAAU,QAAQ,WAAaI,EAAE,OACjCJ,EAAU,QAAQ,YAAcI,EAAE,OAEtC,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EAEJ,CAEJ,CAMA,SAASO,IAAW,CAClB,KAAM,CAACC,EAAWC,CAAY,EAAInD,EAAAA,SAA2B,IAAI,EAC3D,CAACoD,EAAUC,CAAW,EAAIrD,EAAAA,SAA0B,CAAA,CAAE,EACtD,CAACsD,EAASC,CAAU,EAAIvD,EAAAA,SAAsB,CAAA,CAAE,EAChD,CAACwD,EAAWC,CAAY,EAAIzD,EAAAA,SAAS,EAAE,EACvC,CAAC0D,EAAcC,CAAe,EAAI3D,EAAAA,SAAS,EAAK,EAChD,CAAC4D,EAASC,CAAU,EAAI7D,EAAAA,SAAS,EAAK,EACtC,CAACK,EAASC,CAAU,EAAIN,EAAAA,SAAS,EAAI,EACrC,CAAC8D,EAAYC,CAAa,EAAI/D,EAAAA,SAAS,EAAK,EAC5C,CAACgE,EAAeC,CAAgB,EAAIjE,EAAAA,SAAwB,IAAI,EAChE,CAACkE,EAAUC,CAAW,EAAInE,EAAAA,SAA4D,IAAI,EAE1FoE,EAAUC,EAAAA,YAAY,MAAOC,EAAqB,KAAU,CAChEP,EAAc,EAAI,EAClB,GAAI,CACF,KAAM,CAACQ,EAAYC,EAAYC,CAAO,EAAI,MAAM,QAAQ,IAAI,CAC1D9D,EAAI,IAAI,OAAA,EACRA,EAAI,IAAI,SAAA,EACRA,EAAI,IAAI,IAAI,EAAE,CAAA,CACf,EACDwC,EAAaoB,CAAU,EACvBlB,EAAYmB,EAAW,QAAQ,EAC/BjB,EAAWkB,EAAQ,OAAO,EACtBH,IACFH,EAAY,CAAE,KAAM,UAAW,IAAK,YAAa,EACjD,WAAW,IAAMA,EAAY,IAAI,EAAG,IAAI,EAE5C,OAASO,EAAU,CACjBP,EAAY,CAAE,KAAM,QAAS,IAAKO,EAAI,QAAS,CACjD,QAAA,CACEpE,EAAW,EAAK,EAChByD,EAAc,EAAK,CACrB,CACF,EAAG,CAAA,CAAE,EAELxD,EAAAA,UAAU,IAAM,CAAE6D,EAAA,CAAW,EAAG,CAACA,CAAO,CAAC,EAEzC,SAASO,EAAgBC,EAA2BC,EAAa,CAC/DV,EAAY,CAAE,KAAAS,EAAM,IAAAC,EAAK,EACzB,WAAW,IAAMV,EAAY,IAAI,EAAG,GAAI,CAC1C,CAEA,eAAeW,EAAYC,EAAiB,CAC1Cd,EAAiB,OAAO,EACxB,GAAI,CACF,MAAMtD,EAAI,IAAI,MAAMoE,CAAK,EACzB,MAAMX,EAAA,CACR,OAASM,EAAU,CACjBC,EAAgB,QAASD,EAAI,OAAO,CACtC,QAAA,CACET,EAAiB,IAAI,CACvB,CACF,CAEA,eAAee,EAAcD,EAAiB,CAC5Cd,EAAiB,SAAS,EAC1B,GAAI,CACF,MAAMtD,EAAI,IAAI,QAAQoE,CAAK,EAC3B,MAAMX,EAAA,CACR,OAASM,EAAU,CACjBC,EAAgB,QAASD,EAAI,OAAO,CACtC,QAAA,CACET,EAAiB,IAAI,CACvB,CACF,CAEA,eAAegB,GAAe,CAC5B,GAAKzB,EAAU,OACf,CAAAS,EAAiB,QAAQ,EACzB,GAAI,CACF,MAAMiB,EAAS,MAAMvE,EAAI,IAAI,OAAO6C,EAAU,MAAM,EACpDC,EAAa,EAAE,EACfkB,EAAgB,UAAW,wBAAwB,EACnD,MAAMP,EAAA,CACR,OAASM,EAAU,CACjBC,EAAgB,QAASD,EAAI,OAAO,CACtC,QAAA,CACET,EAAiB,IAAI,CACvB,EACF,CAEA,eAAekB,GAAa,CAC1BlB,EAAiB,MAAM,EACvB,GAAI,CACF,MAAMiB,EAAS,MAAMvE,EAAI,IAAI,KAAA,EAC7BgE,EAAgB,UAAWO,EAAO,SAAW,QAAQ,EACrD,MAAMd,EAAA,CACR,OAASM,EAAU,CACjBC,EAAgB,QAASD,EAAI,OAAO,CACtC,QAAA,CACET,EAAiB,IAAI,CACvB,CACF,CAEA,eAAemB,GAAa,CAC1BnB,EAAiB,MAAM,EACvB,GAAI,CACF,MAAMiB,EAAS,MAAMvE,EAAI,IAAI,KAAA,EAC7BgE,EAAgB,UAAWO,EAAO,SAAW,QAAQ,EACrD,MAAMd,EAAA,CACR,OAASM,EAAU,CACjBC,EAAgB,QAASD,EAAI,OAAO,CACtC,QAAA,CACET,EAAiB,IAAI,CACvB,CACF,CAEA,eAAeoB,EAAeC,EAAgB,CAC5CrB,EAAiB,UAAU,EAC3B,GAAI,CACF,MAAMtD,EAAI,IAAI,SAAS2E,CAAM,EAC7BX,EAAgB,UAAW,eAAeW,CAAM,EAAE,EAClD3B,EAAgB,EAAK,EACrB,MAAMS,EAAA,CACR,OAASM,EAAU,CACjBC,EAAgB,QAASD,EAAI,OAAO,CACtC,QAAA,CACET,EAAiB,IAAI,CACvB,CACF,CAEA,eAAesB,GAAwB,CACrCtB,EAAiB,UAAU,EAC3B,GAAI,GAEef,GAAA,YAAAA,EAAW,MAAM,OAAQsC,GAAM,CAACA,EAAE,UAAW,CAAA,GACjD,OAAS,IACpB,MAAM7E,EAAI,IAAI,MAAM,CAAC,GAAG,CAAC,EACzB,MAAMyD,EAAA,GAER,MAAMc,EAAS,MAAMvE,EAAI,IAAI,sBAAA,EACvBkE,EAAM,OAAOK,GAAW,SAAWA,GAASA,GAAA,YAAAA,EAAQ,UAAW,GACjEL,GACFpB,EAAaoB,CAAG,EAChBF,EAAgB,UAAW,mBAAmB,GAE9CA,EAAgB,QAAS,qBAAqB,CAElD,OAASD,EAAU,CACjBC,EAAgB,QAASD,EAAI,OAAO,CACtC,QAAA,CACET,EAAiB,IAAI,CACvB,CACF,CAEA,GAAI5D,EACF,OACEf,MAAC,OAAI,UAAU,yCACb,eAACoC,EAAA,CAAQ,UAAU,oCAAoC,CAAA,CACzD,EAIJ,MAAM+D,GAAcvC,GAAA,YAAAA,EAAW,MAAM,OAAQsC,GAAMA,EAAE,UAAW,CAAA,EAC1DE,GAAgBxC,GAAA,YAAAA,EAAW,MAAM,OAAQsC,GAAM,CAACA,EAAE,UAAW,CAAA,EAEnE,OACElE,EAAAA,KAAC,MAAA,CAAI,UAAU,uBAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,qEACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAhC,EAAAA,IAACqG,GAAA,CAAU,UAAU,0BAAA,CAA2B,EAChDrG,EAAAA,IAAC,OAAA,CAAK,UAAU,uEAAuE,SAAA,gBAAA,CAEvF,CAAA,EACF,EACAgC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAhC,MAACqC,GAAO,QAAQ,QAAQ,KAAK,OAAO,UAAU,UAAU,QAASyD,EAAY,SAAU,CAAC,CAACpB,EACvF,eAAC4B,GAAA,CAAS,UAAU,UAAU,EAChC,QACCjE,EAAA,CAAO,QAAQ,QAAQ,KAAK,OAAO,UAAU,UAAU,QAASwD,EAAY,SAAU,CAAC,CAACnB,EACvF,eAAClF,GAAA,CAAO,UAAU,UAAU,EAC9B,EACAQ,EAAAA,IAACqC,EAAA,CACC,QAAQ,QACR,KAAK,OACL,UAAU,UACV,QAAS,IAAMyC,EAAQ,EAAI,EAC3B,SAAU,CAAC,CAACJ,GAAiBF,EAC7B,MAAM,UACN,aAAW,UAEX,eAACjF,GAAA,CAAU,UAAW0C,EAAG,UAAWuC,GAAc,cAAc,CAAA,CAAG,CAAA,CAAA,CACrE,CAAA,CACF,CAAA,EACF,QAEClC,GAAA,CAAW,UAAU,SACpB,SAAAN,EAAAA,KAAC,MAAA,CAAI,UAAU,gBAEb,SAAA,CAAAhC,EAAAA,IAACuG,IACE,SAAA3B,GACC5E,EAAAA,IAACwG,GAAO,IAAP,CACC,QAAS,CAAE,QAAS,EAAG,OAAQ,CAAA,EAC/B,QAAS,CAAE,QAAS,EAAG,OAAQ,MAAA,EAC/B,KAAM,CAAE,QAAS,EAAG,OAAQ,CAAA,EAC5B,UAAWvE,EACT,iCACA2C,EAAS,OAAS,UACd,kEACA,qDAAA,EAGL,SAAAA,EAAS,GAAA,CAAA,EAGhB,EAGA5C,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,EAAAA,KAAC,SAAA,CACC,QAAS,IAAMqC,EAAgB,CAACD,CAAY,EAC5C,UAAU,oGAEV,SAAA,CAAApE,EAAAA,IAACqG,GAAA,CAAU,UAAU,0BAAA,CAA2B,QAC/C,OAAA,CAAK,UAAU,cAAe,UAAAzC,GAAA,YAAAA,EAAW,SAAU,IAAI,EACvDA,GAAaA,EAAU,MAAQ,UAC7BL,EAAA,CAAM,QAAQ,UAAU,UAAU,wBACjC,SAAA,CAAAvD,EAAAA,IAACyG,GAAA,CAAQ,UAAU,oBAAA,CAAqB,EAAG7C,EAAU,KAAA,EACvD,EAEDA,GAAaA,EAAU,OAAS,UAC9BL,EAAA,CAAM,QAAQ,UAAU,UAAU,wBACjC,SAAA,CAAAvD,EAAAA,IAAC0G,GAAA,CAAU,UAAU,oBAAA,CAAqB,EAAG9C,EAAU,MAAA,EACzD,QAEDzB,GAAA,CAAa,UAAWF,EAAG,uCAAwCmC,GAAgB,WAAW,CAAA,CAAG,CAAA,CAAA,CAAA,EAIpGpE,EAAAA,IAACuG,IACE,SAAAnC,GACCpE,EAAAA,IAACwG,GAAO,IAAP,CACC,QAAS,CAAE,QAAS,EAAG,OAAQ,CAAA,EAC/B,QAAS,CAAE,QAAS,EAAG,OAAQ,MAAA,EAC/B,KAAM,CAAE,QAAS,EAAG,OAAQ,CAAA,EAC5B,UAAU,kBAEV,eAAC,MAAA,CAAI,UAAU,uDACZ,SAAA1C,EAAS,OAAQ6C,GAAM,CAACA,EAAE,KAAK,WAAW,UAAU,CAAC,EAAE,IAAKA,GAC3D3E,EAAAA,KAAC,SAAA,CAEC,QAAS,IAAM,CAAC2E,EAAE,WAAaZ,EAAeY,EAAE,IAAI,EACpD,UAAW1E,EACT,gFACA0E,EAAE,UACE,6BACA,+DAAA,EAEN,SAAUA,EAAE,WAAa,CAAC,CAACjC,EAE1B,SAAA,CAAAiC,EAAE,WAAa3G,EAAAA,IAAC4G,GAAA,CAAM,UAAU,UAAU,EAC3C5G,EAAAA,IAAC,OAAA,CAAK,UAAU,WAAY,WAAE,IAAA,CAAK,CAAA,CAAA,EAX9B2G,EAAE,IAAA,CAaV,CAAA,CACH,CAAA,CAAA,CACF,CAEJ,CAAA,EACF,EAGA3E,EAAAA,KAAC,MAAA,CAAI,UAAU,cACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,WACb,SAAA,CAAAhC,EAAAA,IAAC,WAAA,CACC,MAAOkE,EACP,SAAWd,GAAMe,EAAaf,EAAE,OAAO,KAAK,EAC5C,YAAY,oBACZ,KAAM,EACN,UAAWnB,EACT,wGACA,4FAAA,CACF,CAAA,EAGFjC,EAAAA,IAAC,SAAA,CACC,QAASiG,EACT,SAAU,CAAC,CAACvB,EACZ,MAAM,6BACN,UAAWzC,EACT,oFACA,0EACAyC,IAAkB,YAAc,eAAA,EAGjC,SAAAA,IAAkB,WACf1E,EAAAA,IAACoC,EAAA,CAAQ,UAAU,oCAAoC,EACvDpC,EAAAA,IAAC6G,GAAA,CAAS,UAAU,SAAA,CAAU,CAAA,CAAA,CAEpC,EACF,EACA7E,EAAAA,KAACK,EAAA,CACC,KAAK,KACL,UAAU,6BACV,SAAU,CAAC6B,EAAU,KAAA,GAAUiC,EAAY,SAAW,GAAK,CAAC,CAACzB,EAC7D,QAASiB,EAER,SAAA,CAAAjB,IAAkB,eACdtC,EAAA,CAAQ,UAAU,uBAAuB,EAC1CpC,EAAAA,IAAC4G,GAAA,CAAM,UAAU,SAAA,CAAU,EAC9B,WACQT,EAAY,OAAO,UAAA,CAAA,CAAA,CAC9B,EACF,EAGCA,EAAY,OAAS,GACpBnE,EAAAA,KAAC,MAAA,CACC,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,8CACb,SAAA,CAAAA,EAAAA,KAAC,OAAA,CAAK,UAAU,uEAAuE,SAAA,CAAA,WAC5EmE,EAAY,OAAO,GAAA,EAC9B,EACAnG,EAAAA,IAACqC,GAAO,QAAQ,QAAQ,KAAK,OAAO,UAAU,UAAU,QAAS,IAAMqD,EAAcS,EAAY,IAAKD,GAAMA,EAAE,IAAI,CAAC,EACjH,SAAAlG,EAAAA,IAACV,GAAA,CAAM,UAAU,SAAA,CAAU,CAAA,CAC7B,CAAA,EACF,QACC,MAAA,CAAI,UAAU,cACZ,SAAA6G,EAAY,IAAKD,GAChBlE,EAAAA,KAAC,MAAA,CAEC,UAAU,+EAET,SAAA,CAAA7B,GAAW+F,EAAE,MAAM,EACpBlG,EAAAA,IAAC,OAAA,CAAK,UAAU,4BAA6B,WAAE,KAAK,EACpDA,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM0F,EAAc,CAACQ,EAAE,IAAI,CAAC,EACrC,UAAU,uDAEV,SAAAlG,EAAAA,IAACV,GAAA,CAAM,UAAU,qDAAA,CAAsD,CAAA,CAAA,CACzE,CAAA,EAVK,UAAU4G,EAAE,IAAI,EAAA,CAYxB,CAAA,CACH,CAAA,EACF,EAIDE,EAAc,OAAS,GACtBpE,EAAAA,KAAC,MAAA,CACC,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,8CACb,SAAA,CAAAA,EAAAA,KAAC,OAAA,CAAK,UAAU,uEAAuE,SAAA,CAAA,YAC3EoE,EAAc,OAAO,GAAA,EACjC,EACApG,EAAAA,IAACqC,GAAO,QAAQ,QAAQ,KAAK,OAAO,UAAU,UAAU,QAAS,IAAMmD,EAAYY,EAAc,IAAKF,GAAMA,EAAE,IAAI,CAAC,EACjH,SAAAlG,EAAAA,IAAC8G,GAAA,CAAK,UAAU,SAAA,CAAU,CAAA,CAC5B,CAAA,EACF,QACC,MAAA,CAAI,UAAU,cACZ,SAAAV,EAAc,IAAKF,GAClBlE,EAAAA,KAAC,MAAA,CAEC,UAAU,+EAET,SAAA,CAAA7B,GAAW+F,EAAE,MAAM,EACpBlG,EAAAA,IAAC,OAAA,CAAK,UAAU,4BAA6B,WAAE,KAAK,EACpDA,EAAAA,IAAC,SAAA,CACC,QAAS,IAAMwF,EAAY,CAACU,EAAE,IAAI,CAAC,EACnC,UAAU,uDAEV,SAAAlG,EAAAA,IAAC8G,GAAA,CAAK,UAAU,qDAAA,CAAsD,CAAA,CAAA,CACxE,CAAA,EAVK,YAAYZ,EAAE,IAAI,EAAA,CAY1B,CAAA,CACH,CAAA,EACF,EAGDC,EAAY,SAAW,GAAKC,EAAc,SAAW,GACpDpG,MAAC,MAAA,CAAI,UAAU,iDAAiD,SAAA,qBAAA,CAEhE,SAID,MAAA,CACC,SAAA,CAAAgC,EAAAA,KAAC,SAAA,CACC,QAAS,IAAMuC,EAAW,CAACD,CAAO,EAClC,UAAU,6CAEV,SAAA,CAAAtE,MAACmC,IAAa,UAAWF,EAAG,qDAAsDqC,GAAW,WAAW,EAAG,EAC3GtE,EAAAA,IAAC,OAAA,CAAK,UAAU,uEAAuE,SAAA,gBAAA,CAEvF,CAAA,CAAA,CAAA,EAEFA,EAAAA,IAACuG,IACE,SAAAjC,GACCtE,EAAAA,IAACwG,GAAO,IAAP,CACC,QAAS,CAAE,QAAS,EAAG,OAAQ,CAAA,EAC/B,QAAS,CAAE,QAAS,EAAG,OAAQ,MAAA,EAC/B,KAAM,CAAE,QAAS,EAAG,OAAQ,CAAA,EAC5B,UAAU,kBAEV,eAAC,MAAA,CAAI,UAAU,cACZ,SAAAxC,EAAQ,IAAK+C,GACZ/G,EAAAA,IAAC,MAAA,CAEC,UAAU,6DAEV,SAAAgC,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACb,SAAA,CAAAhC,EAAAA,IAACgH,GAAA,CAAc,UAAU,+CAAA,CAAgD,EACzEhF,EAAAA,KAAC,MAAA,CAAI,UAAU,iBACb,SAAA,CAAAhC,EAAAA,IAAC,IAAA,CAAE,UAAU,oDACV,SAAA+G,EAAO,QACV,EACA/E,EAAAA,KAAC,IAAA,CAAE,UAAU,2CACX,SAAA,CAAAhC,EAAAA,IAAC,OAAA,CAAK,UAAU,YAAa,SAAA+G,EAAO,MAAM,EAC1C/G,EAAAA,IAAC,OAAA,CAAK,UAAU,OAAO,SAAA,IAAC,EACvB+G,EAAO,IAAA,CAAA,CACV,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EAfKA,EAAO,IAAA,CAiBf,CAAA,CACH,CAAA,CAAA,CACF,CAEJ,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,EACF,CAEJ,CAMA,SAASE,GAAY,CACnB,YAAAC,EACA,SAAAC,EACA,YAAAC,EACA,iBAAAC,CACF,EAKG,CACD,KAAM,CAACC,EAAiBC,CAAkB,EAAI7G,EAAAA,SAA8B,UAAU,EAChF,CAAC8G,EAAiBC,CAAkB,EAAI/G,EAAAA,SAA0B,CAAA,CAAE,EACpE,CAACgH,EAAeC,CAAgB,EAAIjH,EAAAA,SAAS,EAAE,EAC/C,CAACkH,EAAiBC,CAAkB,EAAInH,EAAAA,SAAS,EAAK,EACtD,CAACoH,EAAYC,CAAa,EAAIrH,EAAAA,SAAmB,CAAA,CAAE,EACnD,CAACsH,EAAeC,CAAgB,EAAIvH,EAAAA,SAAS,EAAE,EAC/CwH,EAAcnF,EAAAA,OAAuB,IAAI,EACzCoF,EAAepF,EAAAA,OAAyB,IAAI,EAG5C,CAACqF,EAAWC,CAAY,EAAI3H,EAAAA,SAAS,EAAE,EACvC,CAAE,UAAA4H,CAAA,EAAcC,GAAA,EAChBC,EAAgBC,EAAc,GAAM,EAAE,aAAa,EACnDC,EAAcD,EAAc,GAAM,EAAE,WAAW,EAC/CE,EAAUF,EAAc,GAAM,EAAE,OAAO,EACvCG,EAAWH,EAAc,GAAM,EAAE,QAAQ,EACzCI,EAAaJ,EAAc,GAAM,EAAE,UAAU,EAC7CK,EAAaL,EAAc,GAAM,EAAE,UAAU,EAC7CM,EAAiBN,EAAc,GAAM,EAAE,cAAc,EACrDO,EAAiBP,EAAc,GAAM,EAAE,cAAc,EACrDQ,EAAkBR,EAAc,GAAM,EAAE,eAAe,EACvDS,EAAoBT,EAAc,GAAM,EAAE,iBAAiB,EAE3DU,EAAST,GAAeC,EAG9B1H,EAAAA,UAAU,IAAM,CACViH,EAAY,UACdA,EAAY,QAAQ,UAAYA,EAAY,QAAQ,aAExD,EAAG,CAACV,CAAe,CAAC,EAEpB,eAAe4B,GAAqB,OAClC,MAAMC,EAAM3B,EAAc,KAAA,EAC1B,GAAI,GAAC2B,GAAOzB,GACZ,CAAAD,EAAiB,EAAE,EACnBI,EAAezG,GAAS,CAAC,GAAGA,EAAM+H,CAAG,CAAC,EACtCpB,EAAiB,EAAE,EACnBJ,EAAmB,EAAI,EAEvB,GAAI,CACF,MAAMjC,EAAS,MAAMvE,EAAI,SAAS,KAAKgI,CAAG,EAC1C5B,EAAoBnG,GAAS,CAC3B,GAAGA,EACH,CACE,GAAI,GAAG,KAAK,IAAA,CAAK,GACjB,QAAS+H,EACT,OAAQzD,EAAO,QAAUA,EAAO,OAAS,GACzC,SAAUA,EAAO,SACjB,UAAW,KAAK,IAAA,CAAI,CACtB,CACD,CACH,OAASR,EAAU,CACjBqC,EAAoBnG,GAAS,CAC3B,GAAGA,EACH,CACE,GAAI,GAAG,KAAK,IAAA,CAAK,GACjB,QAAS+H,EACT,OAAQjE,EAAI,QACZ,SAAU,EACV,UAAW,KAAK,IAAA,CAAI,CACtB,CACD,CACH,QAAA,CACEyC,EAAmB,EAAK,GACxBrE,EAAA2E,EAAa,UAAb,MAAA3E,EAAsB,OACxB,EACF,CAEA,SAAS8F,EAAsBlG,EAAwB,CACrD,GAAIA,EAAE,MAAQ,QACZA,EAAE,eAAA,EACFgG,EAAA,UACShG,EAAE,MAAQ,WAEnB,GADAA,EAAE,eAAA,EACE0E,EAAW,OAAS,EAAG,CACzB,MAAMyB,EAASvB,EAAgB,EAAIF,EAAW,OAAS,EAAI,KAAK,IAAI,EAAGE,EAAgB,CAAC,EACxFC,EAAiBsB,CAAM,EACvB5B,EAAiBG,EAAWyB,CAAM,CAAC,CACrC,UACSnG,EAAE,MAAQ,cACnBA,EAAE,eAAA,EACE4E,GAAiB,GAAG,CACtB,MAAMuB,EAASvB,EAAgB,EAC3BuB,GAAUzB,EAAW,QACvBG,EAAiB,EAAE,EACnBN,EAAiB,EAAE,IAEnBM,EAAiBsB,CAAM,EACvB5B,EAAiBG,EAAWyB,CAAM,CAAC,EAEvC,CAEJ,CAEA,eAAeC,GAAiB,CAC9B,MAAMC,EAAUrB,EAAU,KAAA,EAC1B,GAAI,CAACqB,GAAWN,EAAQ,OACxBd,EAAa,EAAE,EAEf,IAAIqB,EAAWV,EACVU,IACHA,EAAW,OAAO,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,EAAG,CAAC,CAAC,GACtET,EAAgBS,CAAQ,GAG1Bb,EAAW,CACT,GAAI,OAAO,WAAA,EACX,KAAM,OACN,QAAAY,EACA,UAAW,IAAI,KAAA,EAAO,YAAA,CAAY,CACnC,EACDX,EAAW,EAAI,EAEfzH,EAAI,KAAK,QAAQ,WAAWqI,EAAU,OAAQD,CAAO,EAClD,KAAK,IAAMP,GAAmB,EAC9B,MAAM,IAAM,CAAC,CAAC,EAEjB,GAAI,CACF,MAAM7H,EAAI,KAAK,KAAKoI,EAASC,CAAQ,CACvC,MAAQ,CACNZ,EAAW,EAAK,EAChBC,EAAA,CACF,CACF,CAGA,MAAMY,EAAiBf,EAAS,MAAM,EAAE,EAExC,OACE5G,EAAAA,KAAC,MAAA,CAAI,UAAU,uBAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,mFAEb,SAAA,CAAAhC,EAAAA,IAAC,MAAA,CAAI,UAAU,4BACZ,SAAAmH,GAAA,MAAAA,EAAU,OACTnF,EAAAA,KAACuB,EAAA,CACC,QAAQ,UACR,UAAWtB,EACT,gCACAkF,EAAS,QAAU,UACf,yCACA,oCAAA,EAGN,SAAA,CAAAnH,EAAAA,IAAC4J,GAAA,CAAI,UAAU,aAAA,CAAc,EAC5BzC,EAAS,QAAU,UAAY,UAAY,MAAA,CAAA,CAAA,QAG7C5D,EAAA,CAAM,QAAQ,UAAU,UAAU,gDAAgD,gBAEnF,EAEJ,EAEAvD,EAAAA,IAAC,OAAA,CAAK,UAAU,oBAAA,CAAqB,EAGpCkH,GACClF,EAAAA,KAAA6H,WAAA,CACE,SAAA,CAAA7J,EAAAA,IAAC,OAAA,CAAK,UAAU,yDACb,SAAAkH,EAAY,YACf,EACAlH,EAAAA,IAAC,OAAA,CAAK,UAAU,oBAAA,CAAqB,EACrCA,EAAAA,IAAC,QAAK,UAAU,yDAAyD,MAAOkH,EAAY,IACzF,WAAY,GAAA,CACf,EACCA,EAAY,OACXlF,EAAAA,KAAA6H,EAAAA,SAAA,CACE,SAAA,CAAA7J,EAAAA,IAAC,OAAA,CAAK,UAAU,oBAAA,CAAqB,EACrCgC,EAAAA,KAAC,MAAA,CAAI,UAAU,gDACb,SAAA,CAAAhC,EAAAA,IAACqG,GAAA,CAAU,UAAU,SAAA,CAAU,EAC/BrG,EAAAA,IAAC,OAAA,CAAK,UAAU,YAAa,WAAY,MAAA,CAAO,CAAA,CAAA,CAClD,CAAA,CAAA,CACF,CAAA,EAEJ,EAGFA,EAAAA,IAAC,OAAA,CAAK,UAAU,QAAA,CAAS,EAGzBgC,EAAAA,KAAC,MAAA,CAAI,UAAU,gDACb,SAAA,CAAAhC,MAAC,OAAI,UAAWiC,EAAG,2BAA4BqG,EAAY,iBAAmB,YAAY,EAAG,EAC7FtI,EAAAA,IAAC,OAAA,CAAM,SAAAsI,EAAY,YAAc,cAAA,CAAe,CAAA,CAAA,CAClD,CAAA,EACF,EAGAtG,EAAAA,KAAC,MAAA,CAAI,UAAU,uEACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,oBACb,SAAA,CAAAA,EAAAA,KAAC,SAAA,CACC,QAAS,IAAMuF,EAAmB,UAAU,EAC5C,UAAWtF,EACT,yFACAqF,IAAoB,WAChB,mCACA,kEAAA,EAGN,SAAA,CAAAtH,EAAAA,IAAC8J,GAAA,CAAa,UAAU,aAAA,CAAc,EAAE,UAAA,CAAA,CAAA,EAG1C9H,EAAAA,KAAC,SAAA,CACC,QAAS,IAAMuF,EAAmB,MAAM,EACxC,UAAWtF,EACT,yFACAqF,IAAoB,OAChB,mCACA,kEAAA,EAGN,SAAA,CAAAtH,EAAAA,IAAC+J,GAAA,CAAc,UAAU,aAAA,CAAc,EAAE,OAExCZ,GAAUnJ,EAAAA,IAACoC,EAAA,CAAQ,UAAU,mCAAA,CAAoC,CAAA,CAAA,CAAA,CACpE,EACF,EACApC,EAAAA,IAAC,SAAA,CACC,QAASqH,EACT,UAAU,8EACV,MAAOD,EAAc,gBAAkB,iBACvC,aAAYA,EAAc,gBAAkB,iBAE3C,SAAAA,QACE/H,GAAA,CAAU,UAAU,cAAc,EAEnCW,EAAAA,IAACZ,GAAA,CAAU,UAAU,aAAA,CAAc,CAAA,CAAA,CAEvC,EACF,EAGAY,EAAAA,IAAC,OAAI,UAAU,iCACZ,aAAoB,WACnBgC,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,IAAKkG,EAAa,UAAU,iDAC9B,SAAA,CAAAV,EAAgB,IAAKwC,GACpBhI,EAAAA,KAAC,MAAA,CAAmB,UAAU,OAC5B,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAhC,EAAAA,IAAC,OAAA,CAAK,UAAU,mBAAmB,SAAA,IAAC,EACpCA,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAiB,WAAM,OAAA,CAAQ,CAAA,EACjD,EACCgK,EAAM,QACLhK,EAAAA,IAAC,MAAA,CAAI,UAAWiC,EACd,8DACA+H,EAAM,WAAa,EAAI,gBAAkB,cAAA,EAExC,WAAM,MAAA,CACT,CAAA,GAXMA,EAAM,EAahB,CACD,EACApC,GACC5F,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACb,SAAA,CAAAhC,EAAAA,IAACoC,EAAA,CAAQ,UAAU,sBAAA,CAAuB,EAC1CpC,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAU,SAAA,YAAA,CAAU,CAAA,CAAA,CACtC,CAAA,EAEJ,EAGAgC,EAAAA,KAAC,MAAA,CAAI,UAAU,0EACb,SAAA,CAAAhC,EAAAA,IAAC,OAAA,CAAK,UAAU,qCAAqC,SAAA,IAAC,EACtDA,EAAAA,IAAC,QAAA,CACC,IAAKmI,EACL,MAAOT,EACP,SAAWtE,GAAMuE,EAAiBvE,EAAE,OAAO,KAAK,EAChD,UAAWkG,EACX,YAAY,oBACZ,UAAU,yGACV,UAAS,EAAA,CAAA,CACX,CAAA,CACF,CAAA,CAAA,CACF,EAEAtH,EAAAA,KAAC,MAAA,CAAI,UAAU,uBAEb,SAAA,CAAAhC,EAAAA,IAACsC,IAAW,UAAU,mBACpB,SAAAN,EAAAA,KAAC,MAAA,CAAI,UAAU,YACZ,SAAA,CAAA2H,EAAe,IAAKpE,GACnBvF,EAAAA,IAAC,MAAA,CAEC,UAAWiC,EACT,+BACAsD,EAAI,OAAS,OACT,qCACAA,EAAI,OAAS,SACX,6BACA,+BAAA,EAGP,SAAAA,EAAI,OAAS,YACZvF,EAAAA,IAACiK,IAAiB,QAAS1E,EAAI,OAAA,CAAS,EAExCvF,EAAAA,IAAC,IAAA,CAAE,UAAU,kCAAmC,WAAI,OAAA,CAAQ,CAAA,EAbzDuF,EAAI,EAAA,CAgBZ,EACAmD,GAAeF,GACdxG,OAAC,MAAA,CAAI,UAAU,qCACb,SAAA,CAAAhC,EAAAA,IAACiK,GAAA,CAAiB,QAASzB,CAAA,CAAe,EAC1CxI,EAAAA,IAAC,OAAA,CAAK,UAAU,4DAAA,CAA6D,CAAA,EAC/E,EAED2I,GAAW,CAACD,GACX1G,EAAAA,KAAC,MAAA,CAAI,UAAU,2FACb,SAAA,CAAAhC,EAAAA,IAACoC,EAAA,CAAQ,UAAU,uCAAA,CAAwC,EAAE,aAAA,CAAA,CAE/D,CAAA,CAAA,CAEJ,CAAA,CACF,EAGAJ,EAAAA,KAAC,MAAA,CAAI,UAAU,2DACb,SAAA,CAAAhC,EAAAA,IAAC,QAAA,CACC,MAAOoI,EACP,SAAWhF,GAAMiF,EAAajF,EAAE,OAAO,KAAK,EAC5C,UAAYA,GAAM,CACZA,EAAE,MAAQ,SAAW,CAACA,EAAE,WAC1BA,EAAE,eAAA,EACFoG,EAAA,EAEJ,EACA,YAAY,iBACZ,SAAUL,EACV,UAAWlH,EACT,wGACAkH,GAAU,YAAA,CACZ,CAAA,EAEFnJ,EAAAA,IAACqC,EAAA,CACC,KAAK,OACL,UAAU,mBACV,SAAU8G,GAAU,CAACf,EAAU,KAAA,EAC/B,QAASoB,EAET,SAAAxJ,EAAAA,IAACkK,GAAA,CAAK,UAAU,aAAA,CAAc,CAAA,CAAA,CAChC,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAEJ,CAAA,EACF,CAEJ,CAMO,SAASC,IAAgB,CAC9B,KAAM,CAAC3H,EAAM4H,CAAO,EAAI1J,EAAAA,SAAoB,CAAA,CAAE,EACxC,CAAC+B,EAAW4H,CAAY,EAAI3J,EAAAA,SAAwB,IAAI,EACxD,CAACwG,EAAaoD,CAAc,EAAI5J,EAAAA,SAA+B,IAAI,EACnE,CAACyG,EAAUoD,CAAW,EAAI7J,EAAAA,SAAoD,IAAI,EAClF,CAAC8J,EAAWC,CAAY,EAAI/J,EAAAA,SAAS,GAAG,EACxC,CAACgK,EAAYC,CAAa,EAAIjK,EAAAA,SAAS,GAAG,EAC1C,CAACkK,EAAcC,CAAe,EAAInK,EAAAA,SAAS,GAAG,EAC9C,CAACoK,EAAiBC,CAAkB,EAAIrK,EAAAA,SAAS,EAAK,EACtD,CAACsK,EAAUC,CAAW,EAAIvK,EAAAA,SAAS,EAAI,EACvC,CAACwK,EAAWC,CAAY,EAAIzK,EAAAA,SAAS,EAAI,EACzC,CAAC0K,EAAkBC,CAAmB,EAAI3K,EAAAA,SAAS,EAAK,EACxD,CAAC4K,EAAaC,CAAc,EAAI7K,EAAAA,SAAS,EAAE,EAC3C,CAAC8K,EAAaC,CAAc,EAAI/K,EAAAA,SAAS,EAAE,EAC3C,CAACgL,EAAeC,CAAgB,EAAIjL,EAAAA,SAAS,EAAK,EAClD,CAACkL,EAAcC,CAAe,EAAInL,EAAAA,SAAS,CAAC,EAGlDO,EAAAA,UAAU,IAAM,CACdI,EAAI,UAAU,KAAA,EAAO,KAAKiJ,CAAc,EAAE,MAAM,IAAM,CAAC,CAAC,EACxDjJ,EAAI,KAAK,OAAA,EAAS,KAAMyK,GAAMvB,EAAY,CAAE,MAAOuB,EAAE,MAAO,OAAQA,EAAE,MAAA,CAAQ,CAAC,EAAE,MAAM,IAAM,CAAC,CAAC,CACjG,EAAG,CAAA,CAAE,EAEL,eAAeC,GAAwB,CACrC,MAAM5K,EAAOmK,EAAY,KAAA,EACzB,GAAKnK,EACL,CAAAwK,EAAiB,EAAI,EACrBF,EAAe,EAAE,EACjB,GAAI,CACF,MAAMpK,EAAI,UAAU,QAAQF,CAAI,EAChC,MAAM6K,EAAO,MAAM3K,EAAI,UAAU,KAAA,EACjCiJ,EAAe0B,CAAI,EACnBX,EAAoB,EAAK,EACzBE,EAAe,EAAE,EAEjBnB,EAAQ,CAAA,CAAE,EACVC,EAAa,IAAI,EACjBwB,EAAiBI,GAAMA,EAAI,CAAC,CAC9B,OAAS7G,EAAU,CACjBqG,EAAerG,EAAI,SAAW,cAAc,CAC9C,QAAA,CACEuG,EAAiB,EAAK,CACxB,EACF,CAGA,eAAeO,EAAS/K,EAAc,CAGpC,GADiBqB,EAAK,KAAMU,GAAMA,EAAE,OAAS/B,CAAI,EACnC,CACZkJ,EAAalJ,CAAI,EACjB,MACF,CAEA,GAAI,CACF,MAAMgL,EAAO,MAAM9K,EAAI,UAAU,KAAKF,CAAI,EACpCzB,EAAMyM,EAAK,MAAQhL,EAAK,SAAS,GAAG,EAAI,IAAMA,EAAK,MAAM,GAAG,EAAE,MAAS,IACvEiL,GAAkB,CACtB,KAAAjL,EACA,KAAMgL,EAAK,KACX,QAASA,EAAK,QACd,SAAU1M,GAAcC,CAAG,EAC3B,MAAO,GACP,gBAAiByM,EAAK,OAAA,EAExB/B,EAAS9I,GAAS,CAAC,GAAGA,EAAM8K,EAAM,CAAC,EACnC/B,EAAalJ,CAAI,CACnB,MAAQ,CAER,CACF,CAEA,SAASkL,EAASlL,EAAc,CAE9B,GADAiJ,EAAS9I,GAASA,EAAK,OAAQ4B,GAAMA,EAAE,OAAS/B,CAAI,CAAC,EACjDsB,IAActB,EAAM,CACtB,MAAMmL,EAAY9J,EAAK,OAAQU,GAAMA,EAAE,OAAS/B,CAAI,EACpDkJ,EAAaiC,EAAU,OAAS,EAAIA,EAAUA,EAAU,OAAS,CAAC,EAAE,KAAO,IAAI,CACjF,CACF,CAEA,eAAeC,EAAQpL,EAAc,CACnC,MAAMkC,EAAMb,EAAK,KAAMU,GAAMA,EAAE,OAAS/B,CAAI,EAC5C,GAAI,GAACkC,GAAO,CAACA,EAAI,OAEjB,GAAI,CACF,MAAMhC,EAAI,UAAU,SAASF,EAAMkC,EAAI,OAAO,EAC9C+G,EAAS9I,GACPA,EAAK,IAAK4B,GACRA,EAAE,OAAS/B,EACP,CAAE,GAAG+B,EAAG,MAAO,GAAO,gBAAiBA,EAAE,SACzCA,CAAA,CACN,CAEJ,MAAQ,CAER,CACF,CAEA,SAASsJ,EAAiBrL,EAAcsI,EAAiB,CACvDW,EAAS9I,GACPA,EAAK,IAAK4B,GACRA,EAAE,OAAS/B,EACP,CAAE,GAAG+B,EAAG,QAAAuG,EAAS,MAAOA,IAAYvG,EAAE,iBACtCA,CAAA,CACN,CAEJ,CAGA,SAASuJ,EACPC,EACAC,EACAC,EACAC,EACAC,GAAkB,GAClB,CACA,MAAMC,EAAWhK,EAAAA,OAAO,EAAK,EA4B7B,MAAO,CAAE,YA1BWgC,cAAa3B,IAAwB,CACvDA,GAAE,eAAA,EACF2J,EAAS,QAAU,GACnB,MAAMC,GAAWN,IAAc,aAAetJ,GAAE,QAAUA,GAAE,QAC5D,IAAI6J,GACJN,EAAUO,IAAQD,GAAeC,EAAUA,EAAI,EAE/C,SAASC,GAAYC,EAAgB,CACnC,GAAI,CAACL,EAAS,QAAS,OACvB,MAAMM,GAAWX,IAAc,aAC3BU,EAAG,QAAUJ,GACbA,GAAWI,EAAG,QACZE,GAAQR,GAAS,CAACO,GAAWA,GACnCV,EAAS,KAAK,IAAIE,EAAK,KAAK,IAAID,EAAKK,GAAgBK,EAAK,CAAC,CAAC,CAC9D,CAEA,SAASC,IAAY,CACnBR,EAAS,QAAU,GACnB,SAAS,oBAAoB,YAAaI,EAAW,EACrD,SAAS,oBAAoB,UAAWI,EAAS,CACnD,CAEA,SAAS,iBAAiB,YAAaJ,EAAW,EAClD,SAAS,iBAAiB,UAAWI,EAAS,CAChD,EAAG,CAACb,EAAWC,EAAUC,EAAKC,EAAKC,EAAM,CAAC,CAEjC,CACX,CAEA,MAAMU,EAAcf,EAAW,aAAchC,EAAc,IAAK,GAAG,EAE7DgD,EAAehB,EAAW,aAAc9B,EAAe,IAAK,IAAK,EAAI,EACrE+C,EAAgBjB,EAAW,WAAY5B,EAAiB,IAAK,GAAG,EAEtE,OACE7I,EAAAA,KAAC,MAAA,CAAI,UAAU,4DAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,yEACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,kCACb,SAAA,CAAAhC,EAAAA,IAACf,GAAA,CAAY,UAAU,0BAAA,CAA2B,QACjD,OAAA,CAAK,UAAU,8BACb,UAAAiI,GAAA,YAAAA,EAAa,cAAe,YAC/B,EACAlH,EAAAA,IAAC,QAAK,UAAU,iEAAiE,MAAOkH,GAAA,YAAAA,EAAa,IAClG,UAAAA,GAAA,YAAAA,EAAa,MAAO,GAAA,CACvB,CAAA,EACF,EACAlH,EAAAA,IAACqC,EAAA,CACC,QAAQ,QACR,KAAK,KACL,UAAU,qEACV,QAAS,IAAM,CAAEgJ,EAAoB,CAACD,CAAgB,EAAGG,GAAerE,GAAA,YAAAA,EAAa,MAAO,EAAE,EAAGuE,EAAe,EAAE,CAAG,EACtH,SAAA,eAAA,CAAA,EAGDzL,EAAAA,IAAC,OAAA,CAAK,UAAU,QAAA,CAAS,EACzBA,EAAAA,IAACqC,EAAA,CACC,QAAQ,QACR,KAAK,KACL,UAAU,mBACV,QAAS,IAAM4I,EAAY,CAACD,CAAQ,EAEnC,WAAW,gBAAkB,eAAA,CAAA,EAEhChL,EAAAA,IAACqC,EAAA,CACC,QAAQ,QACR,KAAK,KACL,UAAU,mBACV,QAAS,IAAM8I,EAAa,CAACD,CAAS,EAErC,WAAY,WAAa,UAAA,CAAA,CAC5B,EACF,EAGAlL,EAAAA,IAACuG,IACE,SAAA6E,GACCpJ,EAAAA,KAACwE,GAAO,IAAP,CACC,QAAS,CAAE,QAAS,EAAG,OAAQ,CAAA,EAC/B,QAAS,CAAE,QAAS,EAAG,OAAQ,MAAA,EAC/B,KAAM,CAAE,QAAS,EAAG,OAAQ,CAAA,EAC5B,UAAU,yCAEV,SAAA,CAAAxE,EAAAA,KAAC,MAAA,CAAI,UAAU,gDACb,SAAA,CAAAhC,EAAAA,IAAC,QAAA,CACC,MAAOsL,EACP,SAAWlI,GAAM,CAAEmI,EAAenI,EAAE,OAAO,KAAK,EAAGqI,EAAe,EAAE,CAAG,EACvE,UAAYrI,GAAM,CAAMA,EAAE,MAAQ,SAAS2I,EAAA,EAA6B3I,EAAE,MAAQ,UAAUiI,EAAoB,EAAK,CAAG,EACxH,YAAY,mBACZ,UAAU,gMACV,UAAS,EAAA,CAAA,EAEXrJ,EAAAA,KAACK,EAAA,CACC,KAAK,KACL,UAAU,oBACV,QAAS0J,EACT,SAAUL,GAAiB,CAACJ,EAAY,KAAA,EAEvC,SAAA,CAAAI,EAAgB1L,EAAAA,IAACoC,GAAQ,UAAU,sBAAA,CAAuB,EAAKpC,EAAAA,IAAC4G,GAAA,CAAM,UAAU,SAAA,CAAU,EAAG,MAAA,CAAA,CAAA,EAGhG5G,EAAAA,IAACqC,EAAA,CACC,KAAK,KACL,QAAQ,QACR,UAAU,cACV,QAAS,IAAMgJ,EAAoB,EAAK,EACzC,SAAA,QAAA,CAAA,CAED,EACF,EACCG,GACCxL,EAAAA,IAAC,IAAA,CAAE,UAAU,iCAAkC,SAAAwL,CAAA,CAAY,CAAA,CAAA,CAAA,EAInE,EAGC,CAACV,GACA9I,EAAAA,KAAC,MAAA,CAAI,UAAU,sCAEZ,SAAA,CAAAgJ,GACChJ,EAAAA,KAAA6H,WAAA,CACE,SAAA,CAAA7J,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,MAAOwK,GAAa,UAAU,kDAC1C,SAAAxK,EAAAA,IAACK,GAAA,CAAgC,WAAY6L,EAAU,UAAW1J,EAAK,IAAKU,GAAMA,EAAE,IAAI,GAArE0I,CAAwE,CAAA,CAC7F,EAEA5L,EAAAA,IAAC,MAAA,CACE,GAAGwN,EACJ,UAAU,2FAAA,CAAA,CACZ,EACF,EAIFxN,EAAAA,IAAC,MAAA,CAAI,UAAU,iCACb,SAAAA,EAAAA,IAACuC,GAAA,CACC,KAAAC,EACA,UAAAC,EACA,YAAa4H,EACb,WAAYgC,EACZ,OAAQE,EACR,gBAAiBC,CAAA,CAAA,EAErB,EAGCtB,GACClL,EAAAA,IAAC,MAAA,CACE,GAAGyN,EACJ,UAAU,2FAAA,CAAA,EAKbvC,GACClL,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,MAAO0K,CAAA,EAAc,UAAU,kDAC3C,SAAA1K,EAAAA,IAAC2D,GAAA,CAAA,EAAciI,CAAc,CAAA,CAC/B,CAAA,EAEJ,EAID,CAACd,GACA9K,EAAAA,IAAC,MAAA,CACE,GAAG0N,EACJ,UAAU,kHAAA,CAAA,EAKd1N,EAAAA,IAAC,MAAA,CACC,MAAO8K,EAAkB,OAAY,CAAE,OAAQF,CAAA,EAC/C,UAAW3I,EACT,kBACA6I,EAAkB,iBAAmB,UAAA,EAGvC,SAAA9K,EAAAA,IAACiH,GAAA,CACC,YAAAC,EACA,SAAAC,EACA,YAAa2D,EACb,iBAAkB,IAAMC,EAAoBmC,GAAM,CAACA,CAAC,CAAA,CAAA,CACtD,CAAA,CACF,EACF,CAEJ","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{e as t}from"./index-
|
|
1
|
+
import{e as t}from"./index-C3YiF4qv.js";/**
|
|
2
2
|
* @license lucide-react v0.511.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
5
5
|
* See the LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/const a=[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]],e=t("activity",a);export{e as A};
|
|
7
|
-
//# sourceMappingURL=activity-
|
|
7
|
+
//# sourceMappingURL=activity-MOTqH8zM.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity-
|
|
1
|
+
{"version":3,"file":"activity-MOTqH8zM.js","sources":["../../node_modules/lucide-react/dist/esm/icons/activity.js"],"sourcesContent":["/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2\",\n key: \"169zse\"\n }\n ]\n];\nconst Activity = createLucideIcon(\"activity\", __iconNode);\n\nexport { __iconNode, Activity as default };\n//# sourceMappingURL=activity.js.map\n"],"names":["__iconNode","Activity","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAa,CACjB,CACE,OACA,CACE,EAAG,6HACH,IAAK,QACX,CACA,CACA,EACMC,EAAWC,EAAiB,WAAYF,CAAU","x_google_ignoreList":[0]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{e as x,c as o}from"./index-
|
|
1
|
+
import{e as x,c as o}from"./index-C3YiF4qv.js";import{j as s}from"./vendor-motion-Dwx3-JO5.js";import{r as l}from"./vendor-react-C7pctHW3.js";import{W as g,X as y,Y as N,Z as r,_ as d,$ as i,a0 as n,a1 as c,a2 as m}from"./vendor-radix-3UdfCgs_.js";import{b as p}from"./button-CNasMlFE.js";/**
|
|
2
2
|
* @license lucide-react v0.511.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
5
5
|
* See the LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/const u=[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]],M=x("trash-2",u),V=g,_=y,A=N,f=l.forwardRef(({className:a,...e},t)=>s.jsx(m,{className:o("fixed inset-0 z-50 bg-black/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",a),...e,ref:t}));f.displayName=m.displayName;const D=l.forwardRef(({className:a,...e},t)=>s.jsxs(A,{children:[s.jsx(f,{}),s.jsx(r,{ref:t,className:o("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",a),...e})]}));D.displayName=r.displayName;const j=({className:a,...e})=>s.jsx("div",{className:o("flex flex-col space-y-2 text-center sm:text-left",a),...e});j.displayName="AlertDialogHeader";const b=({className:a,...e})=>s.jsx("div",{className:o("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",a),...e});b.displayName="AlertDialogFooter";const w=l.forwardRef(({className:a,...e},t)=>s.jsx(d,{ref:t,className:o("text-lg font-semibold",a),...e}));w.displayName=d.displayName;const h=l.forwardRef(({className:a,...e},t)=>s.jsx(i,{ref:t,className:o("text-sm text-muted-foreground",a),...e}));h.displayName=i.displayName;const k=l.forwardRef(({className:a,...e},t)=>s.jsx(c,{ref:t,className:o(p(),a),...e}));k.displayName=c.displayName;const v=l.forwardRef(({className:a,...e},t)=>s.jsx(n,{ref:t,className:o(p({variant:"outline"}),"mt-2 sm:mt-0",a),...e}));v.displayName=n.displayName;export{V as A,M as T,D as a,j as b,w as c,h as d,b as e,v as f,k as g,_ as h};
|
|
7
|
-
//# sourceMappingURL=alert-dialog-
|
|
7
|
+
//# sourceMappingURL=alert-dialog-MbYSbZx5.js.map
|