@nextclaw/ui 0.25.4 → 0.26.1
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/CHANGELOG.md +61 -0
- package/dist/.vite/manifest.json +1158 -1392
- package/dist/assets/{abnfDiagram-VRR7QNED-DX_u5BBX.js → abnfDiagram-VRR7QNED-Dcw10Yt1.js} +1 -1
- package/dist/assets/account-panel-ZM2qzKF4.js +1 -0
- package/dist/assets/{aiden0z-pptx-renderer.es-C-E9e5yB.js → aiden0z-pptx-renderer.es--oNqetPA.js} +1 -1
- package/dist/assets/api-Cjq-o1VN.js +20 -0
- package/dist/assets/app-presenter-provider-C02YPoMr.js +124 -0
- package/dist/assets/appearance-settings-page-B4zouKzg.js +1 -0
- package/dist/assets/{arc-Cxwa624o.js → arc-DBRedCax.js} +1 -1
- package/dist/assets/architecture-TIHT7OUA-CvnC-LeA.js +1 -0
- package/dist/assets/{architectureDiagram-ZJ3FMSHR-D8mCj0H1.js → architectureDiagram-ZJ3FMSHR-Dufhtuv-.js} +1 -1
- package/dist/assets/{blockDiagram-677ZJIJ3-CbGC1IHl.js → blockDiagram-677ZJIJ3-BUk0vtJ7.js} +1 -1
- package/dist/assets/{book-open-xqEj1OLE.js → book-open-AteA89HX.js} +1 -1
- package/dist/assets/{c4Diagram-LMCZKHZV-BQhGC1Vc.js → c4Diagram-LMCZKHZV-CxDcVE9p.js} +1 -1
- package/dist/assets/card-BLXvBstA.js +1 -0
- package/dist/assets/channel-CpMstUPF.js +1 -0
- package/dist/assets/channels-list-page-fj8kMo-T.js +8 -0
- package/dist/assets/chunk-2Q5K7J3B-Djp3VF0s.js +1 -0
- package/dist/assets/{chunk-32BRIVSS-B74ZZwYG.js → chunk-32BRIVSS-DSF3KElA.js} +1 -1
- package/dist/assets/{chunk-52WLFC77-BvmxW_f_.js → chunk-52WLFC77-Costxzr3.js} +1 -1
- package/dist/assets/{chunk-5FCAYU7R-DQvBRnwL.js → chunk-5FCAYU7R-rhqzGGZo.js} +1 -1
- package/dist/assets/{chunk-5HE753X5-CDIH0_y3.js → chunk-5HE753X5-BsEsmIao.js} +1 -1
- package/dist/assets/{chunk-5JV3BV7I-CcevlKd-.js → chunk-5JV3BV7I-Dqw_DCoN.js} +1 -1
- package/dist/assets/{chunk-5TONJI2A-_3dxVdnY.js → chunk-5TONJI2A-Cft82fp8.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-pGO5vvo-.js → chunk-5VM5RSS4-DqNHn9Dl.js} +1 -1
- package/dist/assets/{chunk-7BUUIJ7U-DEKF5uAN.js → chunk-7BUUIJ7U-A5SBEMYY.js} +1 -1
- package/dist/assets/{chunk-BIQX33UG-CjBFgq2r.js → chunk-BIQX33UG-1Ng3mTrH.js} +1 -1
- package/dist/assets/{chunk-C7G6YPKG-e_K9OGTz.js → chunk-C7G6YPKG-DRJEy8ZI.js} +1 -1
- package/dist/assets/{chunk-CQNSW5MT-C2IiHyHz.js → chunk-CQNSW5MT-Bydv_J3J.js} +1 -1
- package/dist/assets/{chunk-CYSBUYHQ-DCC6KmGp.js → chunk-CYSBUYHQ-HkMIg12u.js} +1 -1
- package/dist/assets/{chunk-EMLP6XTP-BYGgekQ0.js → chunk-EMLP6XTP-C5ndDvm3.js} +1 -1
- package/dist/assets/{chunk-EX3LRPZG-FGcwuVsA.js → chunk-EX3LRPZG-DzeloZRo.js} +1 -1
- package/dist/assets/{chunk-FWX5IMBZ-CV3Ih_Os.js → chunk-FWX5IMBZ-n_2_CLTQ.js} +2 -2
- package/dist/assets/{chunk-HOUHSVGY-CXpq_hfV.js → chunk-HOUHSVGY-kx_slvu3.js} +1 -1
- package/dist/assets/{chunk-ICXQ74PX-CZIpjupq.js → chunk-ICXQ74PX-sQLMURqL.js} +1 -1
- package/dist/assets/{chunk-JG7HCLWE-CdgwBpW7.js → chunk-JG7HCLWE-CMUn5Elc.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-BPjAZpOQ.js → chunk-JWPE2WC7-Cra3s-Uk.js} +1 -1
- package/dist/assets/{chunk-MOJQB5TN-DbJDm8to.js → chunk-MOJQB5TN-umcrg5Bi.js} +1 -1
- package/dist/assets/{chunk-MOZMSUNE-BUa1fqKn.js → chunk-MOZMSUNE-BnljD1ig.js} +1 -1
- package/dist/assets/{chunk-OGEWGWER-CtnzLgRu.js → chunk-OGEWGWER-BXx5pQjU.js} +1 -1
- package/dist/assets/{chunk-OSBZ3O6U-fUgdpTUM.js → chunk-OSBZ3O6U-D-1qfdWu.js} +1 -1
- package/dist/assets/{chunk-PUDLZKDR-CtDWZT9-.js → chunk-PUDLZKDR-DLzX78LC.js} +1 -1
- package/dist/assets/{chunk-Q4XR5HBZ-BxnK2qxr.js → chunk-Q4XR5HBZ-DTK-rtW6.js} +1 -1
- package/dist/assets/{chunk-QBLGF6JB-CH4UKoCF.js → chunk-QBLGF6JB-CsFeIGfr.js} +1 -1
- package/dist/assets/{chunk-R7FJI6CG-BxwFoF1v.js → chunk-R7FJI6CG-4xNYUeng.js} +1 -1
- package/dist/assets/{chunk-RYQCIY6F-DpHAmq7O.js → chunk-RYQCIY6F-DJiHiTE5.js} +1 -1
- package/dist/assets/{chunk-U6XO7XAA-BjH2VUHU.js → chunk-U6XO7XAA-BVYkauHz.js} +1 -1
- package/dist/assets/{chunk-V7JOEXUC-DKJZ3HGj.js → chunk-V7JOEXUC-BsazE8cS.js} +1 -1
- package/dist/assets/chunk-VAUOI2AC-BrbiIC1Q.js +1 -0
- package/dist/assets/{chunk-VR4S4FIN-Cf-o2GtI.js → chunk-VR4S4FIN-7RoZQffO.js} +1 -1
- package/dist/assets/{chunk-WYO6CB5R-zeNXGm20.js → chunk-WYO6CB5R-DEuS6N1R.js} +3 -3
- package/dist/assets/chunk-XXDRQBXY-Cx9N40wF.js +1 -0
- package/dist/assets/{chunk-YOTPTUD7-Ck87Kqxe.js → chunk-YOTPTUD7-9KBrosZL.js} +1 -1
- package/dist/assets/{chunk-ZGVPDNZ5-BbfK6Bfd.js → chunk-ZGVPDNZ5-IYgN9f5A.js} +1 -1
- package/dist/assets/{chunk-ZIRB5QZD-BDpzh4Yl.js → chunk-ZIRB5QZD-BUo0-zcp.js} +1 -1
- package/dist/assets/{circle-dashed-CU3yApvP.js → circle-dashed-LSYZTzM7.js} +1 -1
- package/dist/assets/classDiagram-OUVF2IWQ-DFN1v3PQ.js +1 -0
- package/dist/assets/classDiagram-v2-EOCWNBFH-DRvglADa.js +1 -0
- package/dist/assets/client-DudCRJw4.js +1 -0
- package/dist/assets/config-split-page-G7Kt2BnV.js +1 -0
- package/dist/assets/confirm-dialog-DShT64F6.js +1 -0
- package/dist/assets/context-menu-rd7b_kVD.js +1 -0
- package/dist/assets/{cose-bilkent-JH36ORCC-CQfMxKCT.js → cose-bilkent-JH36ORCC-DhqbC1fR.js} +1 -1
- package/dist/assets/createLucideIcon-D7hvIHV-.js +1 -0
- package/dist/assets/cynefin-VYW2F7L2-DXUGnpJH.js +1 -0
- package/dist/assets/{cynefinDiagram-TSTJHNR4-CxFTiC-p.js → cynefinDiagram-TSTJHNR4-C-TBRi5V.js} +1 -1
- package/dist/assets/{dagre-CaBNMcB1.js → dagre-CrgsRasE.js} +1 -1
- package/dist/assets/{dagre-VKFMJZFB-S_7Hc7bI.js → dagre-VKFMJZFB-BmafJymp.js} +1 -1
- package/dist/assets/desktop-capabilities-page-CzqzFZUY.js +1 -0
- package/dist/assets/desktop-update-config-CgeQ0Ffo.js +1 -0
- package/dist/assets/{diagram-FQU43EPY-C7zENvFb.js → diagram-FQU43EPY-BoOMwa6D.js} +1 -1
- package/dist/assets/{diagram-G47NLZAW-DqYTCqZA.js → diagram-G47NLZAW-Le7N6Uym.js} +1 -1
- package/dist/assets/{diagram-NH7WQ7WH-BfSJtXRc.js → diagram-NH7WQ7WH-Fbpj3-MO.js} +1 -1
- package/dist/assets/{diagram-OA4YK3LP-CFO-j67H.js → diagram-OA4YK3LP-D3QuGGuu.js} +1 -1
- package/dist/assets/{diagram-WEI45ONY-DBQDbTaJ.js → diagram-WEI45ONY-Cxu1uiN6.js} +1 -1
- package/dist/assets/dialog-C7glmAQJ.js +5 -0
- package/dist/assets/doc-browser-context-BlhBAOLH.js +1 -0
- package/dist/assets/doc-browser-dBiR9Qi0.js +1 -0
- package/dist/assets/{docx-preview-B4-aDfvO.js → docx-preview-CkU2psnd.js} +1 -1
- package/dist/assets/download-BYgECE0n.js +1 -0
- package/dist/assets/{ebnfDiagram-CCIWWBDH-CfDNIXFN.js → ebnfDiagram-CCIWWBDH-CCAjuQM6.js} +1 -1
- package/dist/assets/{erDiagram-Q63AITRT-D95rFXMM.js → erDiagram-Q63AITRT-BuzUAq-d.js} +1 -1
- package/dist/assets/es2015-CsjAAQ6X.js +41 -0
- package/dist/assets/eventmodeling-45OFAUF4-ZBfVS3ZC.js +1 -0
- package/dist/assets/extensions-qYL-NpL3.js +1 -0
- package/dist/assets/{eye-C84inPcV.js → eye-BBuTzJ53.js} +1 -1
- package/dist/assets/flowDiagram-23GEKE2U-CqdsKk6x.js +1 -0
- package/dist/assets/form-actions-CLGWO52v.js +1 -0
- package/dist/assets/{ganttDiagram-NO4QXBWP-Bawg0P0r.js → ganttDiagram-NO4QXBWP-cJmWVY8F.js} +1 -1
- package/dist/assets/gitGraph-TEB2WS4Q-fHYFd9Es.js +1 -0
- package/dist/assets/{gitGraphDiagram-IHSO6WYX-BbKh9nbL.js → gitGraphDiagram-IHSO6WYX-F58o-vtP.js} +1 -1
- package/dist/assets/{i18n-20rSH40D.js → i18n-qBGEbcW6.js} +2 -2
- package/dist/assets/info-DKCQHKI2-CSaOL_bb.js +1 -0
- package/dist/assets/{infoDiagram-FWYZ7A6U-DPffZXYh.js → infoDiagram-FWYZ7A6U-Gt59b83C.js} +1 -1
- package/dist/assets/{ishikawaDiagram-FXEZZL3T-CBMsLwZ2.js → ishikawaDiagram-FXEZZL3T-1u4IAj1I.js} +1 -1
- package/dist/assets/{journeyDiagram-5HDEW3XC-Mz5U4OzU.js → journeyDiagram-5HDEW3XC-CCQsfV-5.js} +1 -1
- package/dist/assets/{kanban-definition-HUTT4EX6-FXZq2k19.js → kanban-definition-HUTT4EX6-vlB6O_Zn.js} +1 -1
- package/dist/assets/katex-B4FQSo9k.js +1 -0
- package/dist/assets/keyboard-shortcuts-settings-page-B-wK_6zG.js +1 -0
- package/dist/assets/{line-BZwCgT9K.js → line-D_bHubTL.js} +1 -1
- package/dist/assets/{linear-CTe9mKUw.js → linear-ChlwuS5y.js} +1 -1
- package/dist/assets/loader-circle-BA7EMkih.js +1 -0
- package/dist/assets/login-page-Cd84lpVV.js +1 -0
- package/dist/assets/login-page-VdMyNkFf.js +1 -0
- package/dist/assets/main-CR0SrTBf.js +2 -0
- package/dist/assets/main-DXH6EdXI.css +1 -0
- package/dist/assets/main-i18n-catalog.config-Btp_OowF.js +1 -0
- package/dist/assets/{map-Ci48ZwAp.js → map-oGHTsIu8.js} +1 -1
- package/dist/assets/mcp-marketplace-page-jacRwiI-.js +1 -0
- package/dist/assets/{mermaid-parser.core-CzPD3U_z.js → mermaid-parser.core-CuRe1ZG4.js} +2 -2
- package/dist/assets/{mermaid.core-geIMNPbV.js → mermaid.core-u4YCFKRf.js} +3 -3
- package/dist/assets/{mindmap-definition-LN4V7U3C-xqlKxsr_.js → mindmap-definition-LN4V7U3C-DeJAQYTu.js} +1 -1
- package/dist/assets/model-config-page-D0DQlSDa.js +1 -0
- package/dist/assets/navigation-history-CzErJuPG.js +1 -0
- package/dist/assets/navigation-link-32iM1-e6.js +3 -0
- package/dist/assets/{ordinal-MxnX8yhv.js → ordinal-C6JFfkKN.js} +1 -1
- package/dist/assets/packet-7NZHBO7P-D-YFTczs.js +1 -0
- package/dist/assets/panel-app-CC0bVSu4.js +1 -0
- package/dist/assets/panel-app-i18n-catalog.config-LUSBp5Ce.js +1 -0
- package/dist/assets/panelStandalone-C9EKaApN.js +2 -0
- package/dist/assets/{pegDiagram-2B236MQR-D50MFTN1.js → pegDiagram-2B236MQR-nVMkxShH.js} +1 -1
- package/dist/assets/pie-RZYD4A2V-VEnYu9s5.js +1 -0
- package/dist/assets/{pieDiagram-ENE6RG2P-CpA13oiC.js → pieDiagram-ENE6RG2P-8aUH44QZ.js} +1 -1
- package/dist/assets/privacy-settings-page-Bxxx12OO.js +1 -0
- package/dist/assets/projects-D56yAPNT.js +1 -0
- package/dist/assets/provider-models-C3frdXeW.js +1 -0
- package/dist/assets/provider-scoped-model-input-CYetrPYZ.js +1 -0
- package/dist/assets/providers-config-page-DESB1h8g.js +1 -0
- package/dist/assets/{puzzle-D6gulz7u.js → puzzle-CWHfFyYN.js} +1 -1
- package/dist/assets/pwa-CiGUjpcd.js +1 -0
- package/dist/assets/{quadrantDiagram-ABIIQ3AL-CYCgaj4l.js → quadrantDiagram-ABIIQ3AL-EY8hpFv8.js} +1 -1
- package/dist/assets/radar-I7S5WNFK-BFNIekC1.js +1 -0
- package/dist/assets/railroad-3IZDKUUU-lVqJ3Hak.js +1 -0
- package/dist/assets/railroad-abnf-AHOZXSZD-DYaefdFC.js +1 -0
- package/dist/assets/railroad-ebnf-EBAXGLYW-CTAk6lVq.js +1 -0
- package/dist/assets/railroad-peg-LSFZ7HO6-Cob294tg.js +1 -0
- package/dist/assets/{railroadDiagram-RFXS5EU6-4LKDGlXN.js → railroadDiagram-RFXS5EU6-CNhcIeji.js} +1 -1
- package/dist/assets/{refresh-cw-h9Xq3LY3.js → refresh-cw-y3L6PyLt.js} +1 -1
- package/dist/assets/remote-DiGFV8nP.js +1 -0
- package/dist/assets/{requirementDiagram-TGXJPOKE-CxNOU0JH.js → requirementDiagram-TGXJPOKE-D8Dcs-Rt.js} +1 -1
- package/dist/assets/{rotate-cw-B6xm41Wn.js → rotate-cw-CNE9qSHi.js} +1 -1
- package/dist/assets/runtime-config-page-5o98T-TD.js +1 -0
- package/dist/assets/{sankeyDiagram-HTMAVEWB-DbCBDe2S.js → sankeyDiagram-HTMAVEWB-HTrb6aa-.js} +1 -1
- package/dist/assets/{save-fff_WpY2.js → save-B0p5a0ET.js} +1 -1
- package/dist/assets/search-config-page-CpGcnIzi.js +1 -0
- package/dist/assets/secrets-config-page-C4VTiW3r.js +3 -0
- package/dist/assets/security-config-C5-RQVpS.js +1 -0
- package/dist/assets/select-CctTN205.js +1 -0
- package/dist/assets/{sequenceDiagram-DBY2YBRQ-DA6W2BS_.js → sequenceDiagram-DBY2YBRQ-6f_4X16Y.js} +1 -1
- package/dist/assets/service-apps-panel-CKE5HKNY.js +1 -0
- package/dist/assets/{settings-2-CE3ELQyk.js → settings-2-EPflrNk6.js} +1 -1
- package/dist/assets/{sizeCapture-X5ZJPWSS-T_q_d_VW.js → sizeCapture-X5ZJPWSS-Ck9rsuwL.js} +1 -1
- package/dist/assets/{src-CYpUlx-4.js → src-C8AUg09O.js} +1 -1
- package/dist/assets/{stateDiagram-2N3HPSRC-mi8z2G0a.js → stateDiagram-2N3HPSRC-Cm33MLHu.js} +1 -1
- package/dist/assets/stateDiagram-v2-6OUMAXLB-BrNv-raG.js +1 -0
- package/dist/assets/status-dot-CensgJZC.js +1 -0
- package/dist/assets/{swimlanes-5IMT3BWC-DkBEhWE4.js → swimlanes-5IMT3BWC-B107vmvM.js} +2 -2
- package/dist/assets/swimlanesDiagram-G3AALYLV-ntcxaPXp.js +8 -0
- package/dist/assets/tag-chip-Bjzb4-qW.js +1 -0
- package/dist/assets/theme-provider-hlle7Skk.js +1 -0
- package/dist/assets/{timeline-definition-FHXFAJF6-BoFmqBw1.js → timeline-definition-FHXFAJF6-CJEoAj33.js} +1 -1
- package/dist/assets/trash-2-C5KH5Rw9.js +1 -0
- package/dist/assets/treeView-QDETBFTQ-DbFmr-gw.js +1 -0
- package/dist/assets/treemap-6X3UGDF4-C8aY96pi.js +1 -0
- package/dist/assets/use-config-CPl_F79t.js +1 -0
- package/dist/assets/use-desktop-capabilities-CEg9-DrQ.js +1 -0
- package/dist/assets/use-viewport-layout-CPZUmTPi.js +1 -0
- package/dist/assets/{vennDiagram-L72KCM5P-BlZ3Or5U.js → vennDiagram-L72KCM5P-DzsUHk5I.js} +1 -1
- package/dist/assets/wardley-OPB4EBWU-D8d6DbbJ.js +1 -0
- package/dist/assets/{wardleyDiagram-EHGQE667-yDfr33i3.js → wardleyDiagram-EHGQE667-1NfFs5ua.js} +1 -1
- package/dist/assets/x--xxUvHKW.js +1 -0
- package/dist/assets/{xychartDiagram-FW5EYKEG-mIXwIGAQ.js → xychartDiagram-FW5EYKEG-Ci8AI3Qo.js} +1 -1
- package/dist/index.html +38 -54
- package/dist/panel-standalone.html +11 -15
- package/package.json +8 -8
- package/src/app/components/layout/__tests__/app-layout.test.tsx +7 -0
- package/src/app/components/layout/__tests__/sidebar.layout.test.tsx +36 -16
- package/src/app/components/layout/app-layout.tsx +18 -46
- package/src/app/components/layout/sidebar-items.tsx +27 -18
- package/src/app/components/layout/sidebar-rail.styles.ts +11 -2
- package/src/app/components/layout/sidebar.tsx +3 -2
- package/src/app/configs/__tests__/app-navigation.config.test.ts +4 -0
- package/src/app/configs/app-navigation.config.ts +41 -86
- package/src/app/configs/page-resource-renderers.config.ts +13 -0
- package/src/app/index.tsx +4 -0
- package/src/app/presenters/app.presenter.ts +13 -2
- package/src/features/agents/components/__tests__/agents-page.test.tsx +4 -0
- package/src/features/agents/components/agent-details-dialog.tsx +5 -2
- package/src/features/agents/components/agents-page.tsx +9 -4
- package/src/features/apps/components/app-package-card.tsx +2 -2
- package/src/features/chat/components/conversation/chat-conversation-content.tsx +32 -19
- package/src/features/chat/components/conversation/chat-conversation-header-section.tsx +1 -0
- package/src/features/chat/components/conversation/chat-conversation-header.tsx +1 -1
- package/src/features/chat/components/conversation/chat-conversation-panel.tsx +2 -2
- package/src/features/chat/components/conversation/chat-conversation-workspace-section.tsx +1 -0
- package/src/features/chat/components/layout/__tests__/chat-page-shell.test.tsx +5 -6
- package/src/features/chat/components/layout/__tests__/chat-sidebar-toolbar.test.tsx +14 -12
- package/src/features/chat/components/layout/chat-page-shell.tsx +31 -64
- package/src/features/chat/components/layout/chat-sidebar-desktop-layout.tsx +8 -5
- package/src/features/chat/components/layout/chat-sidebar-toolbar.tsx +64 -256
- package/src/features/chat/components/layout/chat-sidebar.tsx +8 -30
- package/src/features/chat/components/providers/chat-runtime.provider.tsx +62 -0
- package/src/features/chat/features/conversation/components/__tests__/floating-session-conversation.test.tsx +70 -0
- package/src/features/chat/features/conversation/components/chat-voice-input-panel.tsx +3 -2
- package/src/features/chat/features/conversation/components/floating-session-conversation.tsx +27 -0
- package/src/features/chat/features/conversation/components/session-conversation-area.tsx +1 -0
- package/src/features/chat/features/conversation/components/session-conversation-panel-tab.tsx +25 -0
- package/src/features/chat/features/conversation/hooks/__tests__/use-chat-voice-input.test.tsx +4 -0
- package/src/features/chat/features/conversation/hooks/use-chat-composer-reference-intent.ts +2 -1
- package/src/features/chat/features/message/components/__tests__/chat-inline-panel-app-card.test.tsx +2 -1
- package/src/features/chat/features/message/components/__tests__/chat-message-assistant-header.container.test.tsx +3 -0
- package/src/features/chat/features/message/components/__tests__/chat-message-list-skill-preview.container.test.tsx +3 -0
- package/src/features/chat/features/message/components/__tests__/chat-message-list.container.test.tsx +35 -47
- package/src/features/chat/features/message/components/chat-message-list.container.tsx +6 -10
- package/src/features/chat/features/message/hooks/use-chat-inline-token-actions.ts +7 -3
- package/src/features/chat/features/message/utils/__tests__/chat-message-process-summary.utils.test.ts +52 -6
- package/src/features/chat/features/message/utils/chat-message-process-summary.utils.ts +22 -37
- package/src/features/chat/features/session/components/__tests__/chat-sidebar-project-groups.test.tsx +1 -1
- package/src/features/chat/features/session/components/__tests__/chat-sidebar-session-item.test.tsx +21 -0
- package/src/features/chat/features/session/components/chat-mobile-session-row.tsx +61 -0
- package/src/features/chat/features/session/components/chat-sidebar-project-groups.tsx +4 -37
- package/src/features/chat/features/session/components/chat-sidebar-session-entry.tsx +2 -0
- package/src/features/chat/features/session/components/chat-sidebar-session-item.tsx +18 -7
- package/src/features/chat/features/session/components/chat-sidebar-session-list.tsx +5 -3
- package/src/features/chat/features/session/components/session-header/__tests__/chat-session-header-actions.test.tsx +10 -2
- package/src/features/chat/features/session/components/session-header/chat-session-header-actions.tsx +20 -17
- package/src/features/chat/features/session/components/session-header/chat-session-header-menu-item.tsx +4 -4
- package/src/features/chat/features/session/components/session-header/chat-session-more-actions-menu.tsx +18 -5
- package/src/features/chat/features/session/utils/chat-session-route.utils.ts +12 -0
- package/src/features/chat/features/workspace/components/__tests__/chat-session-child-sessions.test.tsx +28 -0
- package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-file-preview.test.tsx +9 -0
- package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-panel-content.test.tsx +6 -2
- package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-panel.test.tsx +49 -12
- package/src/features/chat/features/workspace/components/chat-session-workspace-file-preview.tsx +13 -6
- package/src/features/chat/features/workspace/components/chat-session-workspace-panel-content.tsx +6 -0
- package/src/features/chat/features/workspace/components/chat-session-workspace-panel-nav.tsx +21 -36
- package/src/features/chat/features/workspace/components/chat-session-workspace-panel.tsx +40 -31
- package/src/features/chat/features/workspace/components/child-sessions/chat-session-child-sessions.tsx +6 -1
- package/src/features/chat/features/workspace/components/project-files/workspace-directory-tree.tsx +2 -2
- package/src/features/chat/features/workspace/components/project-files/workspace-project-files-toolbar.tsx +2 -2
- package/src/features/chat/features/workspace/utils/__tests__/chat-workspace-panel-view-model.utils.test.ts +27 -0
- package/src/features/chat/features/workspace/utils/__tests__/workspace-file-panel-route.utils.test.ts +94 -0
- package/src/features/chat/features/workspace/utils/chat-workspace-file-tab-persistence.utils.ts +2 -0
- package/src/features/chat/features/workspace/utils/chat-workspace-file-tab.utils.ts +15 -0
- package/src/features/chat/features/workspace/utils/chat-workspace-panel-view-model.utils.ts +11 -0
- package/src/features/chat/features/workspace/utils/workspace-file-panel-route.utils.ts +147 -0
- package/src/features/chat/index.ts +20 -4
- package/src/features/chat/managers/__tests__/chat-completion-notification.manager.test.ts +8 -0
- package/src/features/chat/managers/__tests__/chat-thread-workspace.manager.test.ts +7 -2
- package/src/features/chat/managers/__tests__/session-surface.manager.test.ts +45 -0
- package/src/features/chat/managers/chat-completion-notification.manager.ts +5 -0
- package/src/features/chat/managers/chat-composer-intent.manager.ts +16 -0
- package/src/features/chat/managers/chat-thread.manager.ts +18 -27
- package/src/features/chat/managers/chat-voice-input.manager.ts +5 -3
- package/src/features/chat/managers/session-surface.manager.ts +46 -0
- package/src/features/chat/pages/__tests__/ncp-chat-page.test.tsx +23 -5
- package/src/features/chat/pages/ncp-chat-page.tsx +6 -86
- package/src/features/chat/presenters/chat.presenter.ts +2 -1
- package/src/features/chat/stores/__tests__/chat-thread.store.test.ts +2 -2
- package/src/features/chat/stores/chat-thread.store.ts +7 -1
- package/src/features/chat/stores/floating-session.store.ts +11 -0
- package/src/features/chat/utils/chat-voice-permissions.utils.test.ts +12 -1
- package/src/features/chat/utils/chat-voice-permissions.utils.ts +6 -1
- package/src/features/cron/components/__tests__/cron-config.test.tsx +4 -0
- package/src/features/cron/components/cron-job-detail-dialog.tsx +3 -1
- package/src/features/cron/components/cron-job-row.tsx +14 -8
- package/src/features/inbox/components/inbox-reader-dialog.test.tsx +3 -0
- package/src/features/inbox/components/inbox-reader-dialog.tsx +6 -1
- package/src/features/inbox/pages/inbox-page.test.ts +3 -0
- package/src/features/inbox/pages/inbox-page.tsx +12 -4
- package/src/features/marketplace/components/__tests__/marketplace-page-detail.test.tsx +5 -1
- package/src/features/marketplace/components/__tests__/marketplace-page.test.tsx +3 -0
- package/src/features/marketplace/components/curated-shelves/__tests__/marketplace-curated-scene-route.test.tsx +2 -0
- package/src/features/marketplace/components/marketplace-list-card.tsx +4 -0
- package/src/features/marketplace/components/mcp/__tests__/mcp-marketplace-page.test.tsx +2 -0
- package/src/features/marketplace/components/mcp/mcp-marketplace-card.tsx +3 -0
- package/src/features/notifications/components/__tests__/app-notification-toast.test.tsx +19 -0
- package/src/features/notifications/components/app-notification-toast.tsx +33 -15
- package/src/features/notifications/managers/app-notification.manager.ts +2 -0
- package/src/features/panel-apps/components/__tests__/panel-app-list-item.test.tsx +13 -4
- package/src/features/panel-apps/components/__tests__/panel-app-toolbar.test.tsx +13 -5
- package/src/features/panel-apps/components/panel-app-list-item.tsx +1 -1
- package/src/features/panel-apps/components/panel-app-main-sidebar-menu-item.tsx +5 -38
- package/src/features/panel-apps/components/panel-app-toolbar.tsx +7 -7
- package/src/features/panel-apps/index.ts +1 -1
- package/src/features/projects/components/project-materials.test.tsx +2 -0
- package/src/features/projects/components/project-skills.tsx +7 -3
- package/src/features/projects/components/work/project-work-item-drawer.test.tsx +2 -0
- package/src/features/projects/components/work/project-work-item-drawer.tsx +3 -1
- package/src/features/right-panel-resources/components/__tests__/page-resource-icon.test.tsx +67 -0
- package/src/features/right-panel-resources/components/__tests__/page-resource-sidebar-nav.test.tsx +183 -0
- package/src/features/right-panel-resources/components/__tests__/system-object-resource.test.tsx +42 -0
- package/src/features/right-panel-resources/components/page-resource-actions-menu.tsx +53 -0
- package/src/features/right-panel-resources/components/page-resource-icon.tsx +245 -0
- package/src/features/right-panel-resources/components/page-resource-sidebar-nav.tsx +119 -0
- package/src/features/right-panel-resources/components/system-object-resource.tsx +100 -0
- package/src/features/right-panel-resources/components/workspace-file-resource.tsx +56 -0
- package/src/features/right-panel-resources/configs/right-panel-resource-routes.config.ts +46 -3
- package/src/features/right-panel-resources/hooks/use-page-resource-actions.ts +190 -0
- package/src/features/right-panel-resources/index.ts +21 -8
- package/src/features/right-panel-resources/managers/__tests__/page-resource.manager.test.ts +149 -0
- package/src/features/right-panel-resources/managers/page-resource.manager.ts +342 -0
- package/src/features/right-panel-resources/pages/resource-page.tsx +114 -0
- package/src/features/right-panel-resources/stores/page-navigation.store.ts +55 -0
- package/src/features/right-panel-resources/types/page-resource.types.ts +11 -0
- package/src/features/right-panel-resources/utils/__tests__/right-panel-resource-route-resolver.utils.test.ts +10 -0
- package/src/features/right-panel-resources/utils/page-resource-identity.utils.ts +61 -0
- package/src/features/right-panel-resources/utils/right-panel-resource-uri.utils.ts +2 -6
- package/src/features/service-apps/components/__tests__/service-apps-panel.test.tsx +2 -0
- package/src/features/service-apps/components/service-app-list-item.tsx +6 -1
- package/src/features/settings/pages/providers-config-page.tsx +2 -2
- package/src/features/side-dock/components/__tests__/side-dock.test.tsx +9 -8
- package/src/features/side-dock/components/side-dock.tsx +14 -47
- package/src/features/side-dock/managers/side-dock.manager.ts +2 -0
- package/src/features/system-status/components/__tests__/desktop-update-config.test.tsx +40 -0
- package/src/features/system-status/components/desktop-update-config.tsx +19 -1
- package/src/platforms/desktop/components/__tests__/desktop-app-shell.test.tsx +2 -0
- package/src/platforms/desktop/components/desktop-app-shell.tsx +3 -14
- package/src/platforms/mobile/components/__tests__/mobile-app-shell.test.tsx +1 -0
- package/src/platforms/mobile/components/__tests__/mobile-bottom-nav.test.tsx +3 -2
- package/src/platforms/mobile/components/mobile-app-shell.tsx +3 -4
- package/src/platforms/mobile/components/mobile-bottom-nav.tsx +7 -7
- package/src/platforms/mobile/components/mobile-settings-shell.tsx +8 -3
- package/src/platforms/mobile/components/mobile-topbar.tsx +4 -4
- package/src/shared/components/doc-browser/__tests__/doc-browser-context.test.tsx +4 -3
- package/src/shared/components/doc-browser/__tests__/doc-browser-tab-strip.test.tsx +0 -5
- package/src/shared/components/doc-browser/__tests__/doc-browser.test.tsx +57 -73
- package/src/shared/components/doc-browser/__tests__/resource-link-interceptor.test.tsx +104 -0
- package/src/shared/components/doc-browser/doc-browser-context.tsx +5 -1
- package/src/shared/components/doc-browser/doc-browser-panel-parts.tsx +1 -1
- package/src/shared/components/doc-browser/doc-browser-tab-strip.tsx +6 -118
- package/src/shared/components/doc-browser/doc-browser.tsx +30 -194
- package/src/shared/components/doc-browser/hooks/use-doc-browser-scroll-restoration.ts +1 -1
- package/src/shared/components/doc-browser/managers/doc-browser.manager.ts +11 -1
- package/src/shared/components/doc-browser/stores/doc-browser.store.ts +3 -7
- package/src/shared/components/doc-browser/types/doc-browser.types.ts +8 -1
- package/src/shared/components/doc-browser/use-doc-link-interceptor.ts +30 -32
- package/src/shared/components/doc-browser/utils/doc-browser-state.utils.ts +6 -6
- package/src/shared/components/ui/context-menu/__tests__/context-menu.test.tsx +105 -1
- package/src/shared/components/ui/context-menu/context-menu-items.tsx +173 -0
- package/src/shared/components/ui/context-menu/context-menu.tsx +99 -112
- package/src/shared/components/ui/dialog.tsx +4 -0
- package/src/shared/components/ui/overlays/sheet.tsx +4 -0
- package/src/shared/components/ui/popover.tsx +10 -4
- package/src/shared/components/workbench/__tests__/workbench-surface.manager.test.ts +70 -0
- package/src/shared/components/workbench/__tests__/workbench-surface.test.tsx +111 -0
- package/src/shared/components/workbench/managers/workbench-surface.manager.ts +120 -0
- package/src/shared/components/workbench/stores/workbench-surface.store.ts +83 -0
- package/src/shared/components/workbench/types/workbench-surface.types.ts +32 -0
- package/src/shared/components/workbench/utils/workbench-surface-geometry.utils.ts +46 -0
- package/src/shared/components/workbench/workbench-surface-toolbar.tsx +102 -0
- package/src/shared/components/workbench/workbench-surface.tsx +401 -0
- package/src/shared/hooks/use-panel-app-scroll-restoration.test.tsx +19 -0
- package/src/shared/hooks/use-panel-app-scroll-restoration.ts +8 -6
- package/src/shared/hooks/use-scroll-restoration.test.tsx +39 -2
- package/src/shared/hooks/use-scroll-restoration.ts +33 -33
- package/src/shared/lib/api/marketplace.types.ts +1 -0
- package/src/shared/lib/i18n/locales/en-US/chat.json +46 -1
- package/src/shared/lib/i18n/locales/en-US/core.json +3 -1
- package/src/shared/lib/i18n/locales/en-US/desktop-update.json +1 -0
- package/src/shared/lib/i18n/locales/en-US/doc-browser.json +1 -1
- package/src/shared/lib/i18n/locales/zh-CN/chat.json +46 -1
- package/src/shared/lib/i18n/locales/zh-CN/core.json +11 -9
- package/src/shared/lib/i18n/locales/zh-CN/desktop-update.json +1 -0
- package/src/shared/lib/navigation-history/index.ts +1 -0
- package/src/shared/lib/navigation-history/navigation-history.utils.ts +1 -1
- package/src/shared/lib/navigation-history/scroll-restoration.manager.test.ts +11 -0
- package/src/shared/lib/navigation-history/scroll-restoration.manager.ts +36 -7
- package/src/shared/lib/navigation-history/view-memory-storage.store.test.ts +37 -0
- package/src/shared/lib/navigation-history/view-memory-storage.store.ts +21 -0
- package/src/shared/lib/transport/__tests__/browser-realtime-recovery.service.test.ts +27 -2
- package/src/shared/lib/transport/__tests__/local-transport.service.test.ts +20 -0
- package/src/shared/lib/transport/__tests__/remote.transport.test.ts +26 -0
- package/src/shared/lib/transport/browser-realtime-recovery.service.ts +32 -5
- package/src/shared/lib/transport/local-transport.service.ts +1 -6
- package/src/shared/lib/transport/remote-transport.service.ts +22 -1
- package/src/shared/lib/ui-document-title/index.ts +1 -0
- package/dist/assets/account-panel-BW4GbzQd.js +0 -1
- package/dist/assets/api-DqzQ-_3w.js +0 -13
- package/dist/assets/app-data-C54N2p8b.js +0 -1
- package/dist/assets/app-presenter-provider-CBZ_-ewx.js +0 -115
- package/dist/assets/appearance-settings-page-C-uZ2Wkf.js +0 -1
- package/dist/assets/architecture-TIHT7OUA-DEt0Abz9.js +0 -1
- package/dist/assets/boxes-D6uPnkGo.js +0 -1
- package/dist/assets/card-BhfAZv5L.js +0 -1
- package/dist/assets/channel-CxQkbwRD.js +0 -1
- package/dist/assets/channels-list-page-Bv7CVSqV.js +0 -8
- package/dist/assets/chevron-down-BL-yMYcX.js +0 -1
- package/dist/assets/chunk-2Q5K7J3B-ClVhziok.js +0 -1
- package/dist/assets/chunk-VAUOI2AC-DZQxkIsv.js +0 -1
- package/dist/assets/chunk-XXDRQBXY-BkExtw5C.js +0 -1
- package/dist/assets/circle-alert-lSa3LRvS.js +0 -1
- package/dist/assets/classDiagram-OUVF2IWQ-Bd6apBb-.js +0 -1
- package/dist/assets/classDiagram-v2-EOCWNBFH-CYxUZGCI.js +0 -1
- package/dist/assets/client-BtGBwLTs.js +0 -1
- package/dist/assets/config-split-page-DqAXKLmG.js +0 -1
- package/dist/assets/confirm-dialog-BTKCWMn6.js +0 -1
- package/dist/assets/createLucideIcon-BNKf0_kc.js +0 -1
- package/dist/assets/cynefin-VYW2F7L2-CV0bFLH9.js +0 -1
- package/dist/assets/desktop-capabilities-page-zLzCSB7A.js +0 -1
- package/dist/assets/desktop-update-config-PmofcFf6.js +0 -1
- package/dist/assets/dialog-Xe73hpQz.js +0 -5
- package/dist/assets/dist-BiIcnf9j.js +0 -1
- package/dist/assets/dist-C5I0v8Qn.js +0 -1
- package/dist/assets/dist-czPa8xFO.js +0 -1
- package/dist/assets/doc-browser-BJrre2S_.js +0 -1
- package/dist/assets/doc-browser-BPqA-zQx.js +0 -1
- package/dist/assets/doc-browser-context-TILuCY5c.js +0 -1
- package/dist/assets/ellipsis-C5YXdOUx.js +0 -1
- package/dist/assets/es2015-cuwbYI-l.js +0 -41
- package/dist/assets/eventmodeling-45OFAUF4-BzkLWWdP.js +0 -1
- package/dist/assets/extensions-CVUFK6Jj.js +0 -1
- package/dist/assets/flowDiagram-23GEKE2U-ukkCsB0j.js +0 -1
- package/dist/assets/form-actions-BRESe-m_.js +0 -1
- package/dist/assets/gitGraph-TEB2WS4Q-BYFhT0Q5.js +0 -1
- package/dist/assets/i18n-provider-BPRq6S7O.js +0 -1
- package/dist/assets/info-DKCQHKI2-CTmlJdcH.js +0 -1
- package/dist/assets/katex-DbZC06Q5.js +0 -1
- package/dist/assets/keyboard-shortcuts-settings-page-CScSXYS4.js +0 -1
- package/dist/assets/loader-circle-K1BDdHR5.js +0 -1
- package/dist/assets/login-page-Dlyvp-81.js +0 -1
- package/dist/assets/login-page-f8qQ4xKY.js +0 -1
- package/dist/assets/logo-badge-C-5-zim6.js +0 -1
- package/dist/assets/main-D2dWy8fM.css +0 -1
- package/dist/assets/main-DMNmwcJE.js +0 -2
- package/dist/assets/main-i18n-catalog.config-DZ-5ollN.js +0 -1
- package/dist/assets/mcp-marketplace-page-FfIfEo6w.js +0 -10
- package/dist/assets/mcp-marketplace-page-sH7VptN_.js +0 -1
- package/dist/assets/model-config-page-Bcm6-pCX.js +0 -1
- package/dist/assets/navigation-link-BAQjgx2F.js +0 -3
- package/dist/assets/packet-7NZHBO7P-BbrI0ZlN.js +0 -1
- package/dist/assets/panel-app-B39rJPj8.js +0 -1
- package/dist/assets/panel-app-i18n-catalog.config-p3qAY_Eq.js +0 -1
- package/dist/assets/panelStandalone-By-6dDXS.js +0 -2
- package/dist/assets/pie-RZYD4A2V-B7zE1ZIr.js +0 -1
- package/dist/assets/plus-LA8-jpxP.js +0 -1
- package/dist/assets/popover-NkrFlWHp.js +0 -1
- package/dist/assets/privacy-settings-page-B1sHLAc1.js +0 -1
- package/dist/assets/projects-Voql-cvx.js +0 -1
- package/dist/assets/provider-models-hrHMcHqg.js +0 -1
- package/dist/assets/provider-scoped-model-input-BQsugx1v.js +0 -1
- package/dist/assets/providers-config-page-BDEdHJbw.js +0 -1
- package/dist/assets/pwa-CzqfYjFx.js +0 -1
- package/dist/assets/radar-I7S5WNFK-1X_q11Ed.js +0 -1
- package/dist/assets/railroad-3IZDKUUU-CIXnuFyE.js +0 -1
- package/dist/assets/railroad-abnf-AHOZXSZD-D6ImKl2r.js +0 -1
- package/dist/assets/railroad-ebnf-EBAXGLYW-2j9d3twU.js +0 -1
- package/dist/assets/railroad-peg-LSFZ7HO6-DMVaJGbm.js +0 -1
- package/dist/assets/remote-BekqL5nA.js +0 -1
- package/dist/assets/runtime-config-page-BH9uF4u_.js +0 -1
- package/dist/assets/search-CUe41wjm.js +0 -1
- package/dist/assets/search-config-page-DWKlMHgH.js +0 -1
- package/dist/assets/secrets-config-page-DiQL088Y.js +0 -3
- package/dist/assets/security-config-DmTDKKY4.js +0 -1
- package/dist/assets/select-CG5YWnwe.js +0 -1
- package/dist/assets/service-apps-panel-CEnyYsQp.js +0 -1
- package/dist/assets/skeleton-Drvn83YW.js +0 -1
- package/dist/assets/stateDiagram-v2-6OUMAXLB-OlIMT57r.js +0 -1
- package/dist/assets/swimlanesDiagram-G3AALYLV-sLThrh07.js +0 -8
- package/dist/assets/tabs-BuE0qKMh.js +0 -1
- package/dist/assets/tag-chip-B1AYPOKL.js +0 -1
- package/dist/assets/theme-provider-DzvAi3pe.js +0 -1
- package/dist/assets/tooltip-DYcuWhuP.js +0 -1
- package/dist/assets/trash-2-BPPYt2NV.js +0 -1
- package/dist/assets/treeView-QDETBFTQ-CCFyazDE.js +0 -1
- package/dist/assets/treemap-6X3UGDF4-D6wvq1Hz.js +0 -1
- package/dist/assets/use-config-BEdbtpD4.js +0 -1
- package/dist/assets/use-desktop-capabilities-BkuRd2cY.js +0 -1
- package/dist/assets/use-panel-app-scroll-restoration-ZnicIfo3.js +0 -1
- package/dist/assets/use-viewport-layout-BS18drMT.js +0 -1
- package/dist/assets/utils-CBZPzC_b.js +0 -8
- package/dist/assets/wardley-OPB4EBWU-BRzaRyFf.js +0 -1
- package/dist/assets/x-DdXOqLnX.js +0 -1
- package/src/features/panel-apps/components/__tests__/panel-app-main-sidebar-nav.test.tsx +0 -219
- package/src/features/panel-apps/components/panel-app-main-sidebar-nav.tsx +0 -258
- package/src/shared/components/doc-browser/utils/doc-browser-floating-panel.utils.ts +0 -83
- /package/dist/assets/{array-D0DyKZdT.js → array-BV9OtnO8.js} +0 -0
- /package/dist/assets/{chunk-KEIR6QF5-CuZFOa6q.js → chunk-KEIR6QF5-Cx-8EJ4_.js} +0 -0
- /package/dist/assets/{chunk-Y2CYZVJY-Frut-1TF.js → chunk-Y2CYZVJY-Dy1ufvjf.js} +0 -0
- /package/dist/assets/{config-hints-B_C9DAp5.js → config-hints-DbmiyTKg.js} +0 -0
- /package/dist/assets/{cytoscape.esm-BibuhnZD.js → cytoscape.esm-CSCjuT4Z.js} +0 -0
- /package/dist/assets/{defaultLocale-q7sRUXPc.js → defaultLocale-DWTiNsbT.js} +0 -0
- /package/dist/assets/{dist-DhMddrrH.js → dist-BVCSkfWY.js} +0 -0
- /package/dist/assets/{graphlib-BM63WsW3.js → graphlib-B1yb1Wl8.js} +0 -0
- /package/dist/assets/{host-capabilities-B107nwS3.js → host-capabilities-DuIFVsvM.js} +0 -0
- /package/dist/assets/{init-CRMkf9sL.js → init-BF6GH5oe.js} +0 -0
- /package/dist/assets/{jszip.min-6thm2J_a.js → jszip.min-D12teKzP.js} +0 -0
- /package/dist/assets/{katex-B26hhTOT.js → katex-CsAM73R9.js} +0 -0
- /package/dist/assets/{middleware-0o3JF3tS.js → middleware-B--6mAUM.js} +0 -0
- /package/dist/assets/{path-BFMmafCM.js → path-C56XkznJ.js} +0 -0
- /package/dist/assets/{rough.esm-5Tjchx1D.js → rough.esm-CGfeEbtE.js} +0 -0
- /package/dist/assets/{xlsx-BC8ibjXK.js → xlsx-sds5nUpL.js} +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { WorkbenchSurfaceManager } from '@/shared/components/workbench/managers/workbench-surface.manager';
|
|
1
2
|
import { fireEvent, render, screen, waitFor } from '@testing-library/react';
|
|
2
3
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
3
4
|
import {
|
|
@@ -23,7 +24,7 @@ describe('SideDock', () => {
|
|
|
23
24
|
it('renders built-in entries and opens the selected resource', () => {
|
|
24
25
|
const openItem = vi.fn();
|
|
25
26
|
const manager = { openItem } as unknown as SideDockManager;
|
|
26
|
-
const docBrowserManager = new DocBrowserManager();
|
|
27
|
+
const docBrowserManager = new DocBrowserManager(new WorkbenchSurfaceManager(), );
|
|
27
28
|
|
|
28
29
|
render(
|
|
29
30
|
<DocBrowserProvider manager={docBrowserManager}>
|
|
@@ -47,7 +48,7 @@ describe('SideDock', () => {
|
|
|
47
48
|
|
|
48
49
|
it('places the GitHub project shortcut in the utility section', () => {
|
|
49
50
|
const manager = { openItem: vi.fn() } as unknown as SideDockManager;
|
|
50
|
-
const docBrowserManager = new DocBrowserManager();
|
|
51
|
+
const docBrowserManager = new DocBrowserManager(new WorkbenchSurfaceManager(), );
|
|
51
52
|
|
|
52
53
|
render(
|
|
53
54
|
<DocBrowserProvider manager={docBrowserManager}>
|
|
@@ -62,7 +63,7 @@ describe('SideDock', () => {
|
|
|
62
63
|
|
|
63
64
|
it('confirms before hiding the dock and persists the visibility preference', async () => {
|
|
64
65
|
const manager = { openItem: vi.fn() } as unknown as SideDockManager;
|
|
65
|
-
const docBrowserManager = new DocBrowserManager();
|
|
66
|
+
const docBrowserManager = new DocBrowserManager(new WorkbenchSurfaceManager(), );
|
|
66
67
|
|
|
67
68
|
render(
|
|
68
69
|
<DocBrowserProvider manager={docBrowserManager}>
|
|
@@ -85,7 +86,7 @@ describe('SideDock', () => {
|
|
|
85
86
|
|
|
86
87
|
it('does not highlight the default docs tab while DocBrowser is closed', () => {
|
|
87
88
|
const manager = { openItem: vi.fn() } as unknown as SideDockManager;
|
|
88
|
-
const docBrowserManager = new DocBrowserManager();
|
|
89
|
+
const docBrowserManager = new DocBrowserManager(new WorkbenchSurfaceManager(), );
|
|
89
90
|
|
|
90
91
|
render(
|
|
91
92
|
<DocBrowserProvider manager={docBrowserManager}>
|
|
@@ -105,7 +106,7 @@ describe('SideDock', () => {
|
|
|
105
106
|
openItem: vi.fn(),
|
|
106
107
|
unpinItem: vi.fn(),
|
|
107
108
|
} as unknown as SideDockManager;
|
|
108
|
-
const docBrowserManager = new DocBrowserManager();
|
|
109
|
+
const docBrowserManager = new DocBrowserManager(new WorkbenchSurfaceManager(), );
|
|
109
110
|
useSideDockStore.getState().setPinnedItems([
|
|
110
111
|
{
|
|
111
112
|
createdAt: '2026-06-02T00:00:00.000Z',
|
|
@@ -134,7 +135,7 @@ describe('SideDock', () => {
|
|
|
134
135
|
openItem: vi.fn(),
|
|
135
136
|
unpinItem: vi.fn(),
|
|
136
137
|
} as unknown as SideDockManager;
|
|
137
|
-
const docBrowserManager = new DocBrowserManager();
|
|
138
|
+
const docBrowserManager = new DocBrowserManager(new WorkbenchSurfaceManager(), );
|
|
138
139
|
useSideDockStore.getState().setPinnedItems([
|
|
139
140
|
{
|
|
140
141
|
createdAt: '2026-06-02T00:00:00.000Z',
|
|
@@ -159,7 +160,7 @@ describe('SideDock', () => {
|
|
|
159
160
|
openItem: vi.fn(),
|
|
160
161
|
unpinItem: vi.fn(),
|
|
161
162
|
} as unknown as SideDockManager;
|
|
162
|
-
const docBrowserManager = new DocBrowserManager();
|
|
163
|
+
const docBrowserManager = new DocBrowserManager(new WorkbenchSurfaceManager(), );
|
|
163
164
|
useSideDockStore.getState().setPinnedItems([
|
|
164
165
|
{
|
|
165
166
|
createdAt: '2026-06-02T00:00:00.000Z',
|
|
@@ -176,6 +177,6 @@ describe('SideDock', () => {
|
|
|
176
177
|
</DocBrowserProvider>,
|
|
177
178
|
);
|
|
178
179
|
|
|
179
|
-
expect(screen.getByText('🎨').className).toContain('text-
|
|
180
|
+
expect(screen.getByText('🎨').parentElement?.className).toContain('text-xl');
|
|
180
181
|
});
|
|
181
182
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { PanelRightClose, X } from 'lucide-react';
|
|
2
2
|
import type { LucideIcon } from 'lucide-react';
|
|
3
3
|
import type { SideDockManager } from '@/features/side-dock/managers/side-dock.manager';
|
|
4
4
|
import {
|
|
@@ -7,9 +7,7 @@ import {
|
|
|
7
7
|
} from '@/features/side-dock/configs/side-dock-built-in-items.config';
|
|
8
8
|
import { useSideDockStore } from '@/features/side-dock/stores/side-dock.store';
|
|
9
9
|
import type {
|
|
10
|
-
SideDockIconName,
|
|
11
10
|
SideDockItem,
|
|
12
|
-
SideDockItemIcon,
|
|
13
11
|
} from '@/features/side-dock/types/side-dock.types';
|
|
14
12
|
import { mergeSideDockItems } from '@/features/side-dock/utils/side-dock-item.utils';
|
|
15
13
|
import {
|
|
@@ -26,56 +24,23 @@ import { useConfirmDialog } from '@/shared/hooks/use-confirm-dialog';
|
|
|
26
24
|
import { t } from '@/shared/lib/i18n';
|
|
27
25
|
import { cn } from '@/shared/lib/utils';
|
|
28
26
|
|
|
27
|
+
import { PageResourceIcon } from '@/features/right-panel-resources';
|
|
28
|
+
import { ContextMenu, type ContextMenuGroup } from '@/shared/components/ui/context-menu/context-menu';
|
|
29
|
+
|
|
29
30
|
type SideDockProps = {
|
|
31
|
+
getItemMenuGroups?: (item: SideDockItem) => ContextMenuGroup[];
|
|
30
32
|
manager: SideDockManager;
|
|
31
33
|
};
|
|
32
34
|
|
|
33
|
-
const SIDE_DOCK_ICON_COMPONENTS: Record<SideDockIconName, LucideIcon> = {
|
|
34
|
-
apps: Boxes,
|
|
35
|
-
docs: BookOpen,
|
|
36
|
-
github: Github,
|
|
37
|
-
'new-tab': Plus,
|
|
38
|
-
'panel-app': AppWindow,
|
|
39
|
-
'service-apps': AppWindow,
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const SIDE_DOCK_UTILITY_ITEM_IDS = new Set<string>([SIDE_DOCK_GITHUB_PROJECT_ITEM_ID]);
|
|
43
|
-
|
|
44
|
-
const SIDE_DOCK_EMOJI_ICON_PATTERN = /^\p{Extended_Pictographic}(?:\uFE0F|\uFE0E)?(?:\u200D\p{Extended_Pictographic}(?:\uFE0F|\uFE0E)?)*$/u;
|
|
45
|
-
|
|
46
|
-
function isSideDockEmojiIcon(value: string): boolean {
|
|
47
|
-
return SIDE_DOCK_EMOJI_ICON_PATTERN.test(value.trim());
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function SideDockItemIconView({ icon }: { icon: SideDockItemIcon }) {
|
|
51
|
-
if (icon.type === 'url') {
|
|
52
|
-
return <img src={icon.url} alt="" className="h-5 w-5 rounded object-cover" />;
|
|
53
|
-
}
|
|
54
|
-
if (icon.type === 'text') {
|
|
55
|
-
if (isSideDockEmojiIcon(icon.value)) {
|
|
56
|
-
return (
|
|
57
|
-
<span className="flex h-7 w-7 items-center justify-center text-[20px] leading-none" aria-hidden="true">
|
|
58
|
-
{icon.value}
|
|
59
|
-
</span>
|
|
60
|
-
);
|
|
61
|
-
}
|
|
62
|
-
return (
|
|
63
|
-
<span className="max-w-7 truncate text-center text-[13px] font-semibold leading-none" aria-hidden="true">
|
|
64
|
-
{icon.value}
|
|
65
|
-
</span>
|
|
66
|
-
);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const Icon = SIDE_DOCK_ICON_COMPONENTS[icon.name];
|
|
70
|
-
return <Icon className="h-5 w-5" aria-hidden="true" />;
|
|
71
|
-
}
|
|
72
35
|
|
|
73
36
|
function SideDockButton({
|
|
74
37
|
active,
|
|
75
38
|
item,
|
|
76
39
|
onOpen,
|
|
77
40
|
onUnpin,
|
|
41
|
+
menuGroups = [],
|
|
78
42
|
}: {
|
|
43
|
+
menuGroups?: ContextMenuGroup[];
|
|
79
44
|
active: boolean;
|
|
80
45
|
item: SideDockItem;
|
|
81
46
|
onOpen: (item: SideDockItem) => void;
|
|
@@ -85,7 +50,7 @@ function SideDockButton({
|
|
|
85
50
|
|
|
86
51
|
return (
|
|
87
52
|
<Tooltip>
|
|
88
|
-
<div className="group relative">
|
|
53
|
+
<ContextMenu groups={menuGroups} label={t('pageActions')}><div className="group relative">
|
|
89
54
|
<TooltipTrigger asChild>
|
|
90
55
|
<button
|
|
91
56
|
type="button"
|
|
@@ -101,7 +66,7 @@ function SideDockButton({
|
|
|
101
66
|
: 'bg-transparent',
|
|
102
67
|
)}
|
|
103
68
|
>
|
|
104
|
-
<
|
|
69
|
+
<span className="flex items-center text-xl"><PageResourceIcon uri={getSideDockResourceUri(item) ?? ''} icon={item.icon} /></span>
|
|
105
70
|
</button>
|
|
106
71
|
</TooltipTrigger>
|
|
107
72
|
{item.removable ? (
|
|
@@ -118,7 +83,7 @@ function SideDockButton({
|
|
|
118
83
|
<X className="h-3 w-3" aria-hidden="true" />
|
|
119
84
|
</button>
|
|
120
85
|
) : null}
|
|
121
|
-
</div>
|
|
86
|
+
</div></ContextMenu>
|
|
122
87
|
<TooltipContent side="left">{label}</TooltipContent>
|
|
123
88
|
</Tooltip>
|
|
124
89
|
);
|
|
@@ -202,10 +167,10 @@ function hasExactActiveSideDockItem(items: SideDockItem[], currentTab?: DocBrows
|
|
|
202
167
|
}
|
|
203
168
|
|
|
204
169
|
function isSideDockUtilityItem(item: SideDockItem): boolean {
|
|
205
|
-
return
|
|
170
|
+
return item.id === SIDE_DOCK_GITHUB_PROJECT_ITEM_ID;
|
|
206
171
|
}
|
|
207
172
|
|
|
208
|
-
export function SideDock({ manager }: SideDockProps) {
|
|
173
|
+
export function SideDock({ manager, getItemMenuGroups }: SideDockProps) {
|
|
209
174
|
const pinnedItems = useSideDockStore((state) => state.pinnedItems);
|
|
210
175
|
const setSideDockVisible = useSideDockStore((state) => state.setVisible);
|
|
211
176
|
const { currentTab, isOpen } = useDocBrowser();
|
|
@@ -237,6 +202,7 @@ export function SideDock({ manager }: SideDockProps) {
|
|
|
237
202
|
{mainItems.map((item) => (
|
|
238
203
|
<SideDockButton
|
|
239
204
|
key={item.id}
|
|
205
|
+
menuGroups={getItemMenuGroups?.(item)}
|
|
240
206
|
active={isSideDockItemActive(item, isOpen, currentTab, hasExactActiveItem)}
|
|
241
207
|
item={item}
|
|
242
208
|
onOpen={manager.openItem}
|
|
@@ -249,6 +215,7 @@ export function SideDock({ manager }: SideDockProps) {
|
|
|
249
215
|
{utilityItems.map((item) => (
|
|
250
216
|
<SideDockButton
|
|
251
217
|
key={item.id}
|
|
218
|
+
menuGroups={getItemMenuGroups?.(item)}
|
|
252
219
|
active={isSideDockItemActive(item, isOpen, currentTab, hasExactActiveItem)}
|
|
253
220
|
item={item}
|
|
254
221
|
onOpen={manager.openItem}
|
|
@@ -176,6 +176,8 @@ export class SideDockManager {
|
|
|
176
176
|
};
|
|
177
177
|
|
|
178
178
|
private getTabResourceUri = (tab?: DocBrowserTab): string | null => {
|
|
179
|
+
// Snapshot-backed previews cannot be reconstructed from a shortcut URI alone.
|
|
180
|
+
if (tab?.viewState != null) return null;
|
|
179
181
|
const uri = tab?.resourceUri ?? tab?.currentUrl;
|
|
180
182
|
const normalized = uri ? normalizeSideDockResourceUri(uri) : '';
|
|
181
183
|
return normalized.length > 0 ? normalized : null;
|
|
@@ -181,6 +181,46 @@ describe('DesktopUpdateConfig', () => {
|
|
|
181
181
|
expect(screen.getByText('fetch failed: getaddrinfo ENOTFOUND updates.nextclaw.io')).toBeTruthy();
|
|
182
182
|
});
|
|
183
183
|
|
|
184
|
+
it('offers a manual Portable Edition download when in-app updates are blocked', () => {
|
|
185
|
+
useRuntimeUpdateStore.setState((state) => ({
|
|
186
|
+
...state,
|
|
187
|
+
snapshot: state.snapshot
|
|
188
|
+
? {
|
|
189
|
+
...state.snapshot,
|
|
190
|
+
status: 'blocked',
|
|
191
|
+
installationKind: 'desktop-bundle',
|
|
192
|
+
blockReason: 'unsupported-installation',
|
|
193
|
+
errorMessage: 'Portable Edition does not support in-app updates yet. Download a newer Portable Edition and keep the data directory.'
|
|
194
|
+
}
|
|
195
|
+
: null
|
|
196
|
+
}));
|
|
197
|
+
|
|
198
|
+
renderDesktopUpdateConfig();
|
|
199
|
+
|
|
200
|
+
const downloadLink = screen.getByRole('link', { name: '下载最新 Portable Edition' });
|
|
201
|
+
expect(downloadLink.getAttribute('href')).toBe('https://github.com/Peiiii/nextclaw/releases');
|
|
202
|
+
expect(downloadLink.getAttribute('target')).toBe('_blank');
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it('does not offer a Portable Edition download for non-desktop update blocks', () => {
|
|
206
|
+
useRuntimeUpdateStore.setState((state) => ({
|
|
207
|
+
...state,
|
|
208
|
+
snapshot: state.snapshot
|
|
209
|
+
? {
|
|
210
|
+
...state.snapshot,
|
|
211
|
+
status: 'blocked',
|
|
212
|
+
installationKind: 'npm-runtime-bundle',
|
|
213
|
+
blockReason: 'unsupported-installation',
|
|
214
|
+
errorMessage: 'This runtime does not support updates.'
|
|
215
|
+
}
|
|
216
|
+
: null
|
|
217
|
+
}));
|
|
218
|
+
|
|
219
|
+
renderDesktopUpdateConfig();
|
|
220
|
+
|
|
221
|
+
expect(screen.queryByRole('link', { name: '下载最新 Portable Edition' })).toBeNull();
|
|
222
|
+
});
|
|
223
|
+
|
|
184
224
|
it('loads structured release notes from the docs JSON endpoint', async () => {
|
|
185
225
|
const fetchMock = vi.fn(async () => new Response(JSON.stringify({
|
|
186
226
|
schemaVersion: 1,
|
|
@@ -16,7 +16,9 @@ import {
|
|
|
16
16
|
type ReleaseNotesLocale,
|
|
17
17
|
type ReleaseNotesSection
|
|
18
18
|
} from '@/features/system-status/utils/update-release-notes.utils';
|
|
19
|
-
import { RefreshCw, RotateCw } from 'lucide-react';
|
|
19
|
+
import { Download, RefreshCw, RotateCw } from 'lucide-react';
|
|
20
|
+
|
|
21
|
+
const PORTABLE_RELEASES_URL = 'https://github.com/Peiiii/nextclaw/releases';
|
|
20
22
|
|
|
21
23
|
const STATUS_LABEL_KEYS: Record<string, string> = {
|
|
22
24
|
checking: 'desktopUpdatesStatusChecking',
|
|
@@ -117,6 +119,12 @@ function getStatusTone(status: string): string {
|
|
|
117
119
|
return 'bg-gray-100 text-gray-700 ring-gray-200';
|
|
118
120
|
}
|
|
119
121
|
|
|
122
|
+
function isPortableUpdateBlocked(snapshot: UpdateSnapshot): boolean {
|
|
123
|
+
return snapshot.status === 'blocked'
|
|
124
|
+
&& snapshot.installationKind === 'desktop-bundle'
|
|
125
|
+
&& snapshot.blockReason === 'unsupported-installation';
|
|
126
|
+
}
|
|
127
|
+
|
|
120
128
|
function getReleaseNotesLocale(): ReleaseNotesLocale {
|
|
121
129
|
return getLanguage() === 'zh' ? 'zh-CN' : 'en-US';
|
|
122
130
|
}
|
|
@@ -265,6 +273,16 @@ export function DesktopUpdateConfig() {
|
|
|
265
273
|
<p className='text-sm font-semibold text-red-800'>{t('desktopUpdatesBlockedTitle')}</p>
|
|
266
274
|
<p className='mt-1 text-sm text-red-700'>{snapshot.errorMessage ?? t('desktopUpdatesBlockedDescription')}</p>
|
|
267
275
|
{snapshot.recoveryCommand ? <code className='mt-3 block rounded-lg bg-white/70 px-3 py-2 text-xs text-red-800'>{snapshot.recoveryCommand}</code> : null}
|
|
276
|
+
{isPortableUpdateBlocked(snapshot) ? (
|
|
277
|
+
<NavigationLink
|
|
278
|
+
href={PORTABLE_RELEASES_URL}
|
|
279
|
+
external
|
|
280
|
+
icon={Download}
|
|
281
|
+
className='mt-3 rounded-full border border-red-300 bg-white/70 px-3 py-2 text-red-800 no-underline hover:bg-white hover:text-red-900 hover:no-underline'
|
|
282
|
+
>
|
|
283
|
+
{t('desktopUpdatesManualPortableDownload')}
|
|
284
|
+
</NavigationLink>
|
|
285
|
+
) : null}
|
|
268
286
|
</div>
|
|
269
287
|
) : null}
|
|
270
288
|
{snapshot.errorMessage && snapshot.status !== 'blocked' ? <div className='rounded-2xl border border-red-200 bg-red-50/70 p-4 text-sm text-red-700'>{snapshot.errorMessage}</div> : null}
|
|
@@ -36,8 +36,6 @@ type DesktopAppShellProps = {
|
|
|
36
36
|
export function DesktopAppShell({
|
|
37
37
|
pathname,
|
|
38
38
|
isMobileLayout = false,
|
|
39
|
-
isDocBrowserOpen,
|
|
40
|
-
docBrowserMode,
|
|
41
39
|
docBrowserDockControls,
|
|
42
40
|
docBrowserRenderers = {},
|
|
43
41
|
docBrowserTabMenuGroups,
|
|
@@ -133,7 +131,7 @@ export function DesktopAppShell({
|
|
|
133
131
|
{shouldUseWindowsChrome ? (
|
|
134
132
|
<DesktopWindowChrome sidebarCollapsed={isSidebarCollapsed} />
|
|
135
133
|
) : null}
|
|
136
|
-
<div className="relative
|
|
134
|
+
<div className="relative flex min-h-0 flex-1 overflow-hidden">
|
|
137
135
|
{!isMainRoute && <Sidebar />}
|
|
138
136
|
<div className="flex-1 flex min-w-0 overflow-hidden relative">
|
|
139
137
|
<div className="flex-1 flex flex-col min-w-0 overflow-hidden">
|
|
@@ -152,7 +150,7 @@ export function DesktopAppShell({
|
|
|
152
150
|
</main>
|
|
153
151
|
)}
|
|
154
152
|
</div>
|
|
155
|
-
{
|
|
153
|
+
{(
|
|
156
154
|
<Suspense fallback={null}>
|
|
157
155
|
<DocBrowser
|
|
158
156
|
customTabRenderers={docBrowserRenderers}
|
|
@@ -160,20 +158,11 @@ export function DesktopAppShell({
|
|
|
160
158
|
getTabMenuGroups={docBrowserTabMenuGroups}
|
|
161
159
|
/>
|
|
162
160
|
</Suspense>
|
|
163
|
-
)
|
|
161
|
+
)}
|
|
164
162
|
{sideDock}
|
|
165
163
|
</div>
|
|
166
164
|
</div>
|
|
167
165
|
{showMobileBottomNav ? <MobileBottomNav /> : null}
|
|
168
|
-
{isDocBrowserOpen && docBrowserMode === "floating" ? (
|
|
169
|
-
<Suspense fallback={null}>
|
|
170
|
-
<DocBrowser
|
|
171
|
-
customTabRenderers={docBrowserRenderers}
|
|
172
|
-
dockControls={docBrowserDockControls}
|
|
173
|
-
getTabMenuGroups={docBrowserTabMenuGroups}
|
|
174
|
-
/>
|
|
175
|
-
</Suspense>
|
|
176
|
-
) : null}
|
|
177
166
|
</div>
|
|
178
167
|
);
|
|
179
168
|
}
|
|
@@ -38,6 +38,7 @@ describe("MobileAppShell", () => {
|
|
|
38
38
|
expect(shell.className).toContain("supports-[height:100dvh]:h-[100dvh]");
|
|
39
39
|
expect(shell.className).not.toContain("h-screen");
|
|
40
40
|
expect(screen.getByTestId("mobile-bottom-nav")).toBeTruthy();
|
|
41
|
+
expect(screen.queryByTestId('mobile-topbar')).toBeNull();
|
|
41
42
|
});
|
|
42
43
|
|
|
43
44
|
it("centers primary route titles without reserving back-button spacers", () => {
|
|
@@ -7,7 +7,8 @@ import { MobileBottomNav } from "@/platforms/mobile/components/mobile-bottom-nav
|
|
|
7
7
|
|
|
8
8
|
const { openAppsMock } = vi.hoisted(() => ({ openAppsMock: vi.fn() }));
|
|
9
9
|
|
|
10
|
-
vi.mock("@/features/panel-apps", () => ({
|
|
10
|
+
vi.mock("@/features/panel-apps", async (importOriginal) => ({
|
|
11
|
+
...await importOriginal<object>(), openApps: openAppsMock }));
|
|
11
12
|
vi.mock("@/shared/components/doc-browser", () => ({
|
|
12
13
|
useDocBrowser: () => ({ open: vi.fn() }),
|
|
13
14
|
}));
|
|
@@ -39,7 +40,7 @@ describe("MobileBottomNav", () => {
|
|
|
39
40
|
).toBeNull();
|
|
40
41
|
expect(screen.getByTestId("mobile-nav-active-indicator")).toBeTruthy();
|
|
41
42
|
expect(screen.getByRole("link", { name: /settings/i }).className).toContain(
|
|
42
|
-
"bg-
|
|
43
|
+
"bg-muted",
|
|
43
44
|
);
|
|
44
45
|
expect(screen.getByTestId("mobile-nav-active-indicator").textContent).toMatch(
|
|
45
46
|
/settings/i,
|
|
@@ -25,7 +25,6 @@ type MobileAppShellProps = {
|
|
|
25
25
|
|
|
26
26
|
export function MobileAppShell({
|
|
27
27
|
pathname,
|
|
28
|
-
isDocBrowserOpen,
|
|
29
28
|
docBrowserDockControls,
|
|
30
29
|
docBrowserRenderers = {},
|
|
31
30
|
docBrowserTabMenuGroups,
|
|
@@ -33,7 +32,7 @@ export function MobileAppShell({
|
|
|
33
32
|
children,
|
|
34
33
|
}: MobileAppShellProps) {
|
|
35
34
|
const isMainRoute = isMainWorkspaceRoute(pathname);
|
|
36
|
-
const showTopbar = !isChatSessionDetailRoute(pathname);
|
|
35
|
+
const showTopbar = pathname !== '/chat' && !isChatSessionDetailRoute(pathname);
|
|
37
36
|
const showBottomNav = !isChatSessionDetailRoute(pathname);
|
|
38
37
|
|
|
39
38
|
return (
|
|
@@ -49,7 +48,7 @@ export function MobileAppShell({
|
|
|
49
48
|
)}
|
|
50
49
|
</div>
|
|
51
50
|
{showBottomNav ? <MobileBottomNav /> : null}
|
|
52
|
-
{
|
|
51
|
+
{(
|
|
53
52
|
<Suspense fallback={null}>
|
|
54
53
|
<DocBrowser
|
|
55
54
|
customTabRenderers={docBrowserRenderers}
|
|
@@ -58,7 +57,7 @@ export function MobileAppShell({
|
|
|
58
57
|
getTabMenuGroups={docBrowserTabMenuGroups}
|
|
59
58
|
/>
|
|
60
59
|
</Suspense>
|
|
61
|
-
)
|
|
60
|
+
)}
|
|
62
61
|
</div>
|
|
63
62
|
);
|
|
64
63
|
}
|
|
@@ -20,7 +20,7 @@ export function MobileBottomNav() {
|
|
|
20
20
|
<nav
|
|
21
21
|
data-testid="mobile-bottom-nav"
|
|
22
22
|
aria-label={t("settings")}
|
|
23
|
-
className="shrink-0 border-t border-
|
|
23
|
+
className="shrink-0 border-t border-border/60 bg-background text-foreground"
|
|
24
24
|
style={{
|
|
25
25
|
paddingBottom: "calc(env(safe-area-inset-bottom, 0px) + 0.25rem)",
|
|
26
26
|
}}
|
|
@@ -39,19 +39,19 @@ export function MobileBottomNav() {
|
|
|
39
39
|
className={cn(
|
|
40
40
|
"group flex min-h-[2.875rem] flex-col items-center justify-center gap-0.5 rounded-xl px-2 py-1 text-[10px] font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border",
|
|
41
41
|
active
|
|
42
|
-
? "bg-
|
|
43
|
-
: "text-
|
|
42
|
+
? "bg-muted text-foreground"
|
|
43
|
+
: "text-muted-foreground hover:bg-muted hover:text-foreground",
|
|
44
44
|
)}
|
|
45
45
|
>
|
|
46
46
|
<span className="relative">
|
|
47
47
|
<item.icon
|
|
48
48
|
className={cn(
|
|
49
49
|
"h-3.5 w-3.5",
|
|
50
|
-
active ? "text-
|
|
50
|
+
active ? "text-foreground" : "text-muted-foreground",
|
|
51
51
|
)}
|
|
52
52
|
/>
|
|
53
53
|
{item.target === "/inbox" && unreadCount > 0 ? (
|
|
54
|
-
<span className="absolute -right-1 -top-1 h-1.5 w-1.5 rounded-full bg-primary ring-1 ring-
|
|
54
|
+
<span className="absolute -right-1 -top-1 h-1.5 w-1.5 rounded-full bg-primary ring-1 ring-background" />
|
|
55
55
|
) : null}
|
|
56
56
|
</span>
|
|
57
57
|
<span className="max-w-full truncate">{item.label}</span>
|
|
@@ -63,9 +63,9 @@ export function MobileBottomNav() {
|
|
|
63
63
|
<button
|
|
64
64
|
type="button"
|
|
65
65
|
onClick={() => openApps(docBrowser)}
|
|
66
|
-
className="group flex min-h-[2.875rem] w-full flex-col items-center justify-center gap-0.5 rounded-xl px-2 py-1 text-[10px] font-medium text-
|
|
66
|
+
className="group flex min-h-[2.875rem] w-full flex-col items-center justify-center gap-0.5 rounded-xl px-2 py-1 text-[10px] font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border"
|
|
67
67
|
>
|
|
68
|
-
<Boxes className="h-3.5 w-3.5 text-
|
|
68
|
+
<Boxes className="h-3.5 w-3.5 text-muted-foreground" />
|
|
69
69
|
<span className="max-w-full truncate">{t("appsTitle")}</span>
|
|
70
70
|
</button>
|
|
71
71
|
</li>
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { NavLink } from "react-router-dom";
|
|
2
|
-
import {
|
|
2
|
+
import { getSettingsNavSections } from "@/app/configs/app-navigation.config";
|
|
3
3
|
import { t } from "@/shared/lib/i18n";
|
|
4
4
|
import { cn } from "@/shared/lib/utils";
|
|
5
5
|
import { useDesktopCapabilityAvailability } from "@/features/desktop-capabilities";
|
|
6
6
|
|
|
7
7
|
export function MobileSettingsShell() {
|
|
8
8
|
const desktopCapabilityAvailable = useDesktopCapabilityAvailability();
|
|
9
|
-
const
|
|
9
|
+
const settingsNavSections = getSettingsNavSections(t, {
|
|
10
10
|
includeKeyboardShortcuts: false,
|
|
11
11
|
includeDesktopCapabilities: desktopCapabilityAvailable,
|
|
12
12
|
});
|
|
@@ -16,7 +16,10 @@ export function MobileSettingsShell() {
|
|
|
16
16
|
data-testid="mobile-settings-shell"
|
|
17
17
|
className="space-y-3 pb-4"
|
|
18
18
|
>
|
|
19
|
-
{
|
|
19
|
+
{settingsNavSections.map((section) => (
|
|
20
|
+
<section key={section.label} className="space-y-2">
|
|
21
|
+
<h2 className="px-1 pt-2 text-xs font-medium text-muted-foreground">{section.label}</h2>
|
|
22
|
+
{section.items.map((item) => (
|
|
20
23
|
<NavLink
|
|
21
24
|
key={item.target}
|
|
22
25
|
to={item.target}
|
|
@@ -38,6 +41,8 @@ export function MobileSettingsShell() {
|
|
|
38
41
|
</p>
|
|
39
42
|
</div>
|
|
40
43
|
</NavLink>
|
|
44
|
+
))}
|
|
45
|
+
</section>
|
|
41
46
|
))}
|
|
42
47
|
</div>
|
|
43
48
|
);
|
|
@@ -11,7 +11,7 @@ export function MobileTopbar({ leadingInset }: { leadingInset?: string }) {
|
|
|
11
11
|
return (
|
|
12
12
|
<header
|
|
13
13
|
data-testid="mobile-topbar"
|
|
14
|
-
className="shrink-0 border-b border-
|
|
14
|
+
className="shrink-0 border-b border-border/60 bg-secondary text-foreground"
|
|
15
15
|
style={{
|
|
16
16
|
paddingTop: "calc(env(safe-area-inset-top, 0px) + 0.25rem)",
|
|
17
17
|
}}
|
|
@@ -24,18 +24,18 @@ export function MobileTopbar({ leadingInset }: { leadingInset?: string }) {
|
|
|
24
24
|
<button
|
|
25
25
|
type="button"
|
|
26
26
|
onClick={() => navigate(routeMeta.backTarget as string)}
|
|
27
|
-
className="inline-flex h-
|
|
27
|
+
className="inline-flex h-11 w-11 shrink-0 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-muted hover:text-foreground"
|
|
28
28
|
aria-label={routeMeta.backLabel ?? t("backToMain")}
|
|
29
29
|
>
|
|
30
30
|
<ArrowLeft className="h-4 w-4" />
|
|
31
31
|
</button>
|
|
32
32
|
) : null}
|
|
33
33
|
<div className="min-w-0 flex-1">
|
|
34
|
-
<h1 className="truncate text-center text-[
|
|
34
|
+
<h1 className="truncate text-center text-[17px] font-semibold text-foreground">
|
|
35
35
|
{routeMeta.title}
|
|
36
36
|
</h1>
|
|
37
37
|
</div>
|
|
38
|
-
{routeMeta.backTarget ? <div className="h-
|
|
38
|
+
{routeMeta.backTarget ? <div className="h-11 w-11 shrink-0" aria-hidden="true" /> : null}
|
|
39
39
|
</div>
|
|
40
40
|
</header>
|
|
41
41
|
);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { WorkbenchSurfaceManager } from '@/shared/components/workbench/managers/workbench-surface.manager';
|
|
1
2
|
import { act, renderHook, waitFor } from '@testing-library/react';
|
|
2
3
|
import type { ReactNode } from 'react';
|
|
3
4
|
import { DocBrowserProvider, useDocBrowser } from '@/shared/components/doc-browser/doc-browser-context';
|
|
@@ -18,7 +19,7 @@ const wrapper = ({ children }: { children: ReactNode }) => (
|
|
|
18
19
|
<DocBrowserProvider manager={testDocBrowserManager}>{children}</DocBrowserProvider>
|
|
19
20
|
);
|
|
20
21
|
|
|
21
|
-
const testDocBrowserManager = new DocBrowserManager(new RightPanelResourceRouteResolver());
|
|
22
|
+
const testDocBrowserManager = new DocBrowserManager(new WorkbenchSurfaceManager(), new RightPanelResourceRouteResolver());
|
|
22
23
|
|
|
23
24
|
const docBrowserStorageKey = 'nextclaw.doc-browser.state';
|
|
24
25
|
|
|
@@ -56,7 +57,7 @@ async function resetMemoryThenRehydrate(savedState: string | null) {
|
|
|
56
57
|
describe('DocBrowserManager layout notifications', () => {
|
|
57
58
|
it('notifies the app layout coordinator after opening the docked browser', () => {
|
|
58
59
|
const onRightPanelOpened = vi.fn();
|
|
59
|
-
const manager = new DocBrowserManager(
|
|
60
|
+
const manager = new DocBrowserManager(new WorkbenchSurfaceManager(),
|
|
60
61
|
new RightPanelResourceRouteResolver(),
|
|
61
62
|
onRightPanelOpened,
|
|
62
63
|
);
|
|
@@ -71,7 +72,7 @@ describe('DocBrowserManager layout notifications', () => {
|
|
|
71
72
|
|
|
72
73
|
it('notifies the app layout coordinator after changing dock mode', () => {
|
|
73
74
|
const onRightPanelOpened = vi.fn();
|
|
74
|
-
const manager = new DocBrowserManager(
|
|
75
|
+
const manager = new DocBrowserManager(new WorkbenchSurfaceManager(),
|
|
75
76
|
new RightPanelResourceRouteResolver(),
|
|
76
77
|
onRightPanelOpened,
|
|
77
78
|
);
|
|
@@ -20,16 +20,11 @@ function renderTabStrip(tabs: DocBrowserTab[]) {
|
|
|
20
20
|
activeTabId={tabs[0]?.id ?? ""}
|
|
21
21
|
canGoBack={false}
|
|
22
22
|
canGoForward={false}
|
|
23
|
-
isDocked={true}
|
|
24
|
-
isFullscreen={false}
|
|
25
23
|
onGoBack={vi.fn()}
|
|
26
24
|
onGoForward={vi.fn()}
|
|
27
25
|
onOpenNewTab={vi.fn()}
|
|
28
26
|
onSetActiveTab={vi.fn()}
|
|
29
27
|
onCloseTab={vi.fn()}
|
|
30
|
-
onClose={vi.fn()}
|
|
31
|
-
onDragStart={vi.fn()}
|
|
32
|
-
onToggleMode={vi.fn()}
|
|
33
28
|
/>,
|
|
34
29
|
);
|
|
35
30
|
}
|