@nextclaw/ui 0.26.5 → 0.27.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 +82 -0
- package/dist/.vite/manifest.json +1342 -1227
- package/dist/assets/{abnfDiagram-VRR7QNED-Dcw10Yt1.js → abnfDiagram-VRR7QNED-BT0_ycaq.js} +1 -1
- package/dist/assets/account-panel-BVNV8XqM.js +1 -0
- package/dist/assets/agents-CfpN8PQc.js +1 -0
- package/dist/assets/agents-E4nu-17c.js +1 -0
- package/dist/assets/{aiden0z-pptx-renderer.es--oNqetPA.js → aiden0z-pptx-renderer.es-ClCaf_Wh.js} +1 -1
- package/dist/assets/api-CI6_8Qt1.js +20 -0
- package/dist/assets/app-presenter-provider-2DwHRRle.js +28 -0
- package/dist/assets/app-presenter-provider-D3BuuOyZ.css +1 -0
- package/dist/assets/appearance-settings-page-Cn9w3F-K.js +1 -0
- package/dist/assets/apps-YFlJirpx.js +1 -0
- package/dist/assets/{arc-DBRedCax.js → arc-cmSdpq1Z.js} +1 -1
- package/dist/assets/architecture-TIHT7OUA-BImoGh10.js +1 -0
- package/dist/assets/{architectureDiagram-ZJ3FMSHR-Dufhtuv-.js → architectureDiagram-ZJ3FMSHR-aYglVeoS.js} +1 -1
- package/dist/assets/{blockDiagram-677ZJIJ3-BUk0vtJ7.js → blockDiagram-677ZJIJ3-Di_PBl5q.js} +1 -1
- package/dist/assets/{book-open-Bcnn2_uV.js → book-open-i_BjUBqL.js} +1 -1
- package/dist/assets/{c4Diagram-LMCZKHZV-CxDcVE9p.js → c4Diagram-LMCZKHZV-CfuxybOL.js} +1 -1
- package/dist/assets/{card-Cqs73hGI.js → card-DokH7OBp.js} +1 -1
- package/dist/assets/channel-BDQry0ob.js +1 -0
- package/dist/assets/channels-list-page-B7G9lHUm.js +8 -0
- package/dist/assets/chunk-2Q5K7J3B-DkgSFfIy.js +1 -0
- package/dist/assets/{chunk-32BRIVSS-DSF3KElA.js → chunk-32BRIVSS-CCGc4qg4.js} +1 -1
- package/dist/assets/{chunk-52WLFC77-Costxzr3.js → chunk-52WLFC77-aJoxU2Ow.js} +1 -1
- package/dist/assets/{chunk-5FCAYU7R-rhqzGGZo.js → chunk-5FCAYU7R-CGwtZSax.js} +1 -1
- package/dist/assets/{chunk-5HE753X5-BsEsmIao.js → chunk-5HE753X5-DqaMSMeS.js} +1 -1
- package/dist/assets/{chunk-5JV3BV7I-Dqw_DCoN.js → chunk-5JV3BV7I-DnabINcd.js} +1 -1
- package/dist/assets/{chunk-5TONJI2A-Cft82fp8.js → chunk-5TONJI2A-BhpKv1k2.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-DqNHn9Dl.js → chunk-5VM5RSS4-DvkRPit_.js} +1 -1
- package/dist/assets/{chunk-7BUUIJ7U-A5SBEMYY.js → chunk-7BUUIJ7U-CgDQOLnC.js} +1 -1
- package/dist/assets/{chunk-BIQX33UG-1Ng3mTrH.js → chunk-BIQX33UG-9FEv5b7T.js} +1 -1
- package/dist/assets/{chunk-C7G6YPKG-DRJEy8ZI.js → chunk-C7G6YPKG-CNGFAFYL.js} +1 -1
- package/dist/assets/{chunk-CQNSW5MT-Bydv_J3J.js → chunk-CQNSW5MT-DovTZx0M.js} +1 -1
- package/dist/assets/{chunk-CYSBUYHQ-HkMIg12u.js → chunk-CYSBUYHQ-DpLEgYa1.js} +1 -1
- package/dist/assets/{chunk-EMLP6XTP-C5ndDvm3.js → chunk-EMLP6XTP-D4NuN01W.js} +1 -1
- package/dist/assets/{chunk-EX3LRPZG-DzeloZRo.js → chunk-EX3LRPZG-D8Jf4kc2.js} +1 -1
- package/dist/assets/{chunk-FWX5IMBZ-n_2_CLTQ.js → chunk-FWX5IMBZ-BdHymAs0.js} +2 -2
- package/dist/assets/{chunk-HOUHSVGY-kx_slvu3.js → chunk-HOUHSVGY-Dd_Ycn9Z.js} +1 -1
- package/dist/assets/{chunk-ICXQ74PX-sQLMURqL.js → chunk-ICXQ74PX-BRPUu3ff.js} +1 -1
- package/dist/assets/{chunk-JG7HCLWE-CMUn5Elc.js → chunk-JG7HCLWE-DnCasQja.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-Cra3s-Uk.js → chunk-JWPE2WC7-C3CkbEj1.js} +1 -1
- package/dist/assets/{chunk-MOJQB5TN-umcrg5Bi.js → chunk-MOJQB5TN-Pi--K4-1.js} +1 -1
- package/dist/assets/{chunk-MOZMSUNE-BnljD1ig.js → chunk-MOZMSUNE-3VTspvlh.js} +1 -1
- package/dist/assets/{chunk-OGEWGWER-BXx5pQjU.js → chunk-OGEWGWER-BetLLyJt.js} +1 -1
- package/dist/assets/{chunk-OSBZ3O6U-D-1qfdWu.js → chunk-OSBZ3O6U-D1VcupAj.js} +1 -1
- package/dist/assets/{chunk-PUDLZKDR-DLzX78LC.js → chunk-PUDLZKDR-Cy4G8SjV.js} +1 -1
- package/dist/assets/{chunk-Q4XR5HBZ-DTK-rtW6.js → chunk-Q4XR5HBZ-UYxXzi7_.js} +1 -1
- package/dist/assets/{chunk-QBLGF6JB-CsFeIGfr.js → chunk-QBLGF6JB-CHiGeRY1.js} +1 -1
- package/dist/assets/{chunk-R7FJI6CG-4xNYUeng.js → chunk-R7FJI6CG-C5kVJus8.js} +1 -1
- package/dist/assets/{chunk-RYQCIY6F-DJiHiTE5.js → chunk-RYQCIY6F-C6cuuEBn.js} +1 -1
- package/dist/assets/{chunk-U6XO7XAA-BVYkauHz.js → chunk-U6XO7XAA-CM0EK7Y0.js} +1 -1
- package/dist/assets/{chunk-V7JOEXUC-BsazE8cS.js → chunk-V7JOEXUC-DWJZIsME.js} +1 -1
- package/dist/assets/chunk-VAUOI2AC-CsTIB8qD.js +1 -0
- package/dist/assets/{chunk-VR4S4FIN-7RoZQffO.js → chunk-VR4S4FIN-CY5KYeEi.js} +1 -1
- package/dist/assets/{chunk-WYO6CB5R-DEuS6N1R.js → chunk-WYO6CB5R-B30N3ZP8.js} +3 -3
- package/dist/assets/chunk-XXDRQBXY-DK6dz0Q3.js +1 -0
- package/dist/assets/{chunk-YOTPTUD7-9KBrosZL.js → chunk-YOTPTUD7-CBu82JpO.js} +1 -1
- package/dist/assets/{chunk-ZGVPDNZ5-IYgN9f5A.js → chunk-ZGVPDNZ5-BN5NX5qA.js} +1 -1
- package/dist/assets/{chunk-ZIRB5QZD-BUo0-zcp.js → chunk-ZIRB5QZD-DcDXK29L.js} +1 -1
- package/dist/assets/{circle-dashed-EY1ScSMe.js → circle-dashed-Cx8CIEbg.js} +1 -1
- package/dist/assets/classDiagram-OUVF2IWQ-BYygHCrp.js +1 -0
- package/dist/assets/classDiagram-v2-EOCWNBFH-BgQ0XKYz.js +1 -0
- package/dist/assets/{client-CH7w6yRV.js → client-CUJUci3r.js} +1 -1
- package/dist/assets/config-split-page-hY1xug28.js +1 -0
- package/dist/assets/confirm-dialog-B-ejV666.js +1 -0
- package/dist/assets/{app-presenter-provider-jNGlmBLe.css → context-menu-DEcVZfaU.css} +1 -1
- package/dist/assets/context-menu-dGVv8klA.js +211 -0
- package/dist/assets/{cose-bilkent-JH36ORCC-DhqbC1fR.js → cose-bilkent-JH36ORCC-CmeJVoTw.js} +1 -1
- package/dist/assets/{createLucideIcon-Cfo2ySi5.js → createLucideIcon-reFMl-W-.js} +1 -1
- package/dist/assets/cron-CH5c55CR.js +1 -0
- package/dist/assets/cynefin-VYW2F7L2-DKbotNWS.js +1 -0
- package/dist/assets/{cynefinDiagram-TSTJHNR4-C-TBRi5V.js → cynefinDiagram-TSTJHNR4-DGOUMgPP.js} +1 -1
- package/dist/assets/{dagre-CrgsRasE.js → dagre-CMxSkbJJ.js} +1 -1
- package/dist/assets/{dagre-VKFMJZFB-BmafJymp.js → dagre-VKFMJZFB-3YUBEXwo.js} +1 -1
- package/dist/assets/{desktop-capabilities-page-BDYITStl.js → desktop-capabilities-page-CYJTQ3nC.js} +1 -1
- package/dist/assets/desktop-update-config-guKAozXO.js +1 -0
- package/dist/assets/{diagram-FQU43EPY-BoOMwa6D.js → diagram-FQU43EPY-Br1g--ww.js} +1 -1
- package/dist/assets/{diagram-G47NLZAW-Le7N6Uym.js → diagram-G47NLZAW-D1wJCBgr.js} +1 -1
- package/dist/assets/{diagram-NH7WQ7WH-Fbpj3-MO.js → diagram-NH7WQ7WH-Cgg2auLH.js} +1 -1
- package/dist/assets/{diagram-OA4YK3LP-D3QuGGuu.js → diagram-OA4YK3LP-R-wHiWqh.js} +1 -1
- package/dist/assets/{diagram-WEI45ONY-Cxu1uiN6.js → diagram-WEI45ONY-CsNnKV0P.js} +1 -1
- package/dist/assets/dialog-DLOwdjT1.js +1 -0
- package/dist/assets/dist-ZaFFmAGl.js +41 -0
- package/dist/assets/doc-browser-ClDUWo9V.js +1 -0
- package/dist/assets/doc-browser-context-CTmOmuqa.js +1 -0
- package/dist/assets/{docx-preview-CkU2psnd.js → docx-preview-kPn_EtAr.js} +1 -1
- package/dist/assets/{download-BoaKzDJk.js → download-DovI3Yvf.js} +1 -1
- package/dist/assets/{ebnfDiagram-CCIWWBDH-CCAjuQM6.js → ebnfDiagram-CCIWWBDH-DCyhIPdi.js} +1 -1
- package/dist/assets/{erDiagram-Q63AITRT-BuzUAq-d.js → erDiagram-Q63AITRT-D0ZJYAUf.js} +1 -1
- package/dist/assets/eventmodeling-45OFAUF4-SIhbIFIw.js +1 -0
- package/dist/assets/extensions-BZ3qrM8M.js +1 -0
- package/dist/assets/external-link-DUD3AbsF.js +1 -0
- package/dist/assets/flowDiagram-23GEKE2U-DdAjkU7I.js +1 -0
- package/dist/assets/{form-actions-D9JWSFQu.js → form-actions-B8VniHts.js} +1 -1
- package/dist/assets/{ganttDiagram-NO4QXBWP-cJmWVY8F.js → ganttDiagram-NO4QXBWP-CiXDcXZD.js} +1 -1
- package/dist/assets/gitGraph-TEB2WS4Q-DnMNpESZ.js +1 -0
- package/dist/assets/{gitGraphDiagram-IHSO6WYX-F58o-vtP.js → gitGraphDiagram-IHSO6WYX-BSiIV48S.js} +1 -1
- package/dist/assets/{i18n-Bm3Ov7Fy.js → i18n-IGQbjBqS.js} +2 -2
- package/dist/assets/inbox-BjBZIbgx.js +1 -0
- package/dist/assets/inbox-ClAG7SI_.js +1 -0
- package/dist/assets/info-DKCQHKI2-BSm-69p_.js +1 -0
- package/dist/assets/{infoDiagram-FWYZ7A6U-Gt59b83C.js → infoDiagram-FWYZ7A6U-CCIgBCVq.js} +1 -1
- package/dist/assets/{ishikawaDiagram-FXEZZL3T-1u4IAj1I.js → ishikawaDiagram-FXEZZL3T-nQ_baN5u.js} +1 -1
- package/dist/assets/{journeyDiagram-5HDEW3XC-CCQsfV-5.js → journeyDiagram-5HDEW3XC-ABueIPzj.js} +1 -1
- package/dist/assets/{kanban-definition-HUTT4EX6-vlB6O_Zn.js → kanban-definition-HUTT4EX6-8FKS3fmQ.js} +1 -1
- package/dist/assets/katex-DPgHtix3.js +1 -0
- package/dist/assets/keyboard-shortcuts-settings-page-BqfbbKir.js +1 -0
- package/dist/assets/{line-D_bHubTL.js → line-Biw8iEUz.js} +1 -1
- package/dist/assets/{linear-ChlwuS5y.js → linear-D7CWUHTF.js} +1 -1
- package/dist/assets/login-page-BxSMwUsc.js +1 -0
- package/dist/assets/{login-page-C-DvcG3L.js → login-page-DYaozpzz.js} +1 -1
- package/dist/assets/main-CWYF9QU_.js +2 -0
- package/dist/assets/main-D_zmSVS1.css +1 -0
- package/dist/assets/main-i18n-catalog.config-itg3Gvzp.js +1 -0
- package/dist/assets/{map-oGHTsIu8.js → map-CDu47gTf.js} +1 -1
- package/dist/assets/marketplace-CnQ5USfr.js +1 -0
- package/dist/assets/mcp-marketplace-page-Dor6H9IC.js +1 -0
- package/dist/assets/{mermaid-parser.core-CuRe1ZG4.js → mermaid-parser.core-Cc9wjl82.js} +2 -2
- package/dist/assets/{mermaid.core-u4YCFKRf.js → mermaid.core-GWlaVWz1.js} +3 -3
- package/dist/assets/{mindmap-definition-LN4V7U3C-DeJAQYTu.js → mindmap-definition-LN4V7U3C-oqnKsz-R.js} +1 -1
- package/dist/assets/model-config-page-Cduyz2Hy.js +1 -0
- package/dist/assets/{navigation-link-CjxNC8aT.js → navigation-link-D-JSWFxj.js} +2 -2
- package/dist/assets/{ordinal-C6JFfkKN.js → ordinal-DImbxqBz.js} +1 -1
- package/dist/assets/packet-7NZHBO7P-1YQvC6mT.js +1 -0
- package/dist/assets/panel-app-BBTg0tVp.js +1 -0
- package/dist/assets/panel-app-i18n-catalog.config-BfLHr1tc.js +1 -0
- package/dist/assets/panel-apps-C-izvtu9.js +1 -0
- package/dist/assets/panelStandalone-XRlWxbRS.css +1 -0
- package/dist/assets/panelStandalone-oHxbXvYt.js +2 -0
- package/dist/assets/{pegDiagram-2B236MQR-nVMkxShH.js → pegDiagram-2B236MQR-DYAB8CEz.js} +1 -1
- package/dist/assets/pie-RZYD4A2V-BGoNOSwu.js +1 -0
- package/dist/assets/{pieDiagram-ENE6RG2P-8aUH44QZ.js → pieDiagram-ENE6RG2P-DGsH0Kk5.js} +1 -1
- package/dist/assets/plus-DUdl68Eo.js +1 -0
- package/dist/assets/privacy-settings-page-DG9E8N-F.js +1 -0
- package/dist/assets/projects-CzBaTOTL.js +1 -0
- package/dist/assets/provider-models-COzjYl29.js +1 -0
- package/dist/assets/provider-scoped-model-input-Cvy74uj8.js +1 -0
- package/dist/assets/providers-config-page-7rCwVnhh.js +1 -0
- package/dist/assets/puzzle-C5Wfpjk_.js +1 -0
- package/dist/assets/pwa-CAg_9zFs.js +1 -0
- package/dist/assets/{quadrantDiagram-ABIIQ3AL-EY8hpFv8.js → quadrantDiagram-ABIIQ3AL-BegGcT3l.js} +1 -1
- package/dist/assets/radar-I7S5WNFK-uPku9RRq.js +1 -0
- package/dist/assets/railroad-3IZDKUUU-DHnmbuIo.js +1 -0
- package/dist/assets/railroad-abnf-AHOZXSZD-DiZs--Iw.js +1 -0
- package/dist/assets/railroad-ebnf-EBAXGLYW-Nr53gnNE.js +1 -0
- package/dist/assets/railroad-peg-LSFZ7HO6-Cm_PuwJS.js +1 -0
- package/dist/assets/{railroadDiagram-RFXS5EU6-CNhcIeji.js → railroadDiagram-RFXS5EU6-B3yJ2yxE.js} +1 -1
- package/dist/assets/{refresh-cw-BlXDrVP0.js → refresh-cw-OhwaPDn1.js} +1 -1
- package/dist/assets/remote-DvCdHjzA.js +1 -0
- package/dist/assets/{requirementDiagram-TGXJPOKE-D8Dcs-Rt.js → requirementDiagram-TGXJPOKE-DtEyoEXG.js} +1 -1
- package/dist/assets/{rotate-cw-ei6rPD6z.js → rotate-cw-aBponvp7.js} +1 -1
- package/dist/assets/runtime-config-page-BF1wxvzR.js +1 -0
- package/dist/assets/{sankeyDiagram-HTMAVEWB-HTrb6aa-.js → sankeyDiagram-HTMAVEWB-h9AYS2UB.js} +1 -1
- package/dist/assets/{save-DdF-bXgC.js → save-394QCMXn.js} +1 -1
- package/dist/assets/search-BG2qAlNZ.js +1 -0
- package/dist/assets/search-config-page-D4LeiB9y.js +1 -0
- package/dist/assets/secrets-config-page-BzGcr5Vw.js +3 -0
- package/dist/assets/security-config-vD_V0BQF.js +1 -0
- package/dist/assets/select-xUXYV0Gr.js +1 -0
- package/dist/assets/{sequenceDiagram-DBY2YBRQ-6f_4X16Y.js → sequenceDiagram-DBY2YBRQ-D-uxCkob.js} +1 -1
- package/dist/assets/service-apps-panel-D3wwPRzV.js +1 -0
- package/dist/assets/{settings-2-CrNhfInU.js → settings-2-CWOGRRaA.js} +1 -1
- package/dist/assets/{sizeCapture-X5ZJPWSS-Ck9rsuwL.js → sizeCapture-X5ZJPWSS-DBzZytQo.js} +1 -1
- package/dist/assets/{src-C8AUg09O.js → src-zrGbZsfc.js} +1 -1
- package/dist/assets/{stateDiagram-2N3HPSRC-Cm33MLHu.js → stateDiagram-2N3HPSRC-DyDy7AHq.js} +1 -1
- package/dist/assets/stateDiagram-v2-6OUMAXLB-CtkpO6aA.js +1 -0
- package/dist/assets/{status-dot-C3SRFEta.js → status-dot-CYifnSnt.js} +1 -1
- package/dist/assets/{swimlanes-5IMT3BWC-B107vmvM.js → swimlanes-5IMT3BWC-BzOduS38.js} +2 -2
- package/dist/assets/swimlanesDiagram-G3AALYLV-BSdi6mvi.js +8 -0
- package/dist/assets/tag-chip-CjM6lyeh.js +1 -0
- package/dist/assets/theme-provider-BToFZGZG.js +1 -0
- package/dist/assets/{timeline-definition-FHXFAJF6-CJEoAj33.js → timeline-definition-FHXFAJF6-CmgnEF2t.js} +1 -1
- package/dist/assets/trash-2-DvJ6duOW.js +1 -0
- package/dist/assets/treeView-QDETBFTQ-DBoqypPR.js +1 -0
- package/dist/assets/treemap-6X3UGDF4-BMeL3P0q.js +1 -0
- package/dist/assets/use-config-COusaY5p.js +1 -0
- package/dist/assets/{use-desktop-capabilities-BYDjFlpt.js → use-desktop-capabilities-B-u6ojjW.js} +1 -1
- package/dist/assets/use-viewport-layout-IKKGpjzF.js +1 -0
- package/dist/assets/{vennDiagram-L72KCM5P-DzsUHk5I.js → vennDiagram-L72KCM5P-DwS7D2kg.js} +1 -1
- package/dist/assets/wardley-OPB4EBWU-Dqxe7zN6.js +1 -0
- package/dist/assets/{wardleyDiagram-EHGQE667-1NfFs5ua.js → wardleyDiagram-EHGQE667-B4X8OOL4.js} +1 -1
- package/dist/assets/x-E9VB4HQx.js +1 -0
- package/dist/assets/{xychartDiagram-FW5EYKEG-Ci8AI3Qo.js → xychartDiagram-FW5EYKEG-BjRQ_0nx.js} +1 -1
- package/dist/index.html +44 -106
- package/dist/panel-standalone.html +19 -13
- package/index.html +15 -66
- package/package.json +5 -5
- package/src/app/styles/design-system.css +85 -1
- package/src/app/styles/island-theme.css +8 -6
- package/src/features/agents/components/__tests__/agents-page.test.tsx +8 -5
- package/src/features/agents/components/agent-details-dialog.tsx +24 -18
- package/src/features/agents/components/agents-page.tsx +27 -38
- package/src/features/app-data/components/app-retained-data-section.tsx +4 -4
- package/src/features/apps/components/__tests__/app-marketplace-catalog.test.tsx +2 -2
- package/src/features/apps/components/__tests__/app-packages-panel.test.tsx +94 -23
- package/src/features/apps/components/__tests__/apps-panel.test.tsx +5 -3
- package/src/features/apps/components/app-document-access-section.tsx +17 -14
- package/src/features/apps/components/app-marketplace-catalog.tsx +69 -42
- package/src/features/apps/components/app-marketplace-cover.tsx +5 -2
- package/src/features/apps/components/app-marketplace-detail.tsx +20 -8
- package/src/features/apps/components/app-marketplace-operation.tsx +8 -3
- package/src/features/apps/components/app-marketplace-panel.tsx +168 -0
- package/src/features/apps/components/app-package-card.tsx +224 -147
- package/src/features/apps/components/app-package-details-dialog.tsx +103 -0
- package/src/features/apps/components/app-packages-panel.tsx +162 -147
- package/src/features/apps/components/apps-panel.tsx +43 -12
- package/src/features/chat/components/conversation/chat-conversation-header-section.tsx +1 -1
- package/src/features/chat/components/conversation/chat-conversation-header.tsx +1 -1
- package/src/features/chat/components/layout/chat-sidebar-toolbar.tsx +2 -2
- package/src/features/chat/components/layout/chat-sidebar-utility-menu.tsx +9 -7
- package/src/features/chat/components/providers/chat-runtime.provider.tsx +1 -1
- package/src/features/chat/features/conversation/components/__tests__/session-conversation-area.test.tsx +0 -1
- package/src/features/chat/features/conversation/components/__tests__/session-conversation-input.streaming.test.tsx +13 -2
- package/src/features/chat/features/conversation/components/floating-session-conversation.tsx +2 -3
- package/src/features/chat/features/conversation/components/session-conversation-area.tsx +9 -1
- package/src/features/chat/features/conversation/components/session-conversation-input-top-slot.tsx +44 -0
- package/src/features/chat/features/conversation/components/session-conversation-input.tsx +4 -38
- package/src/features/chat/features/conversation/hooks/__tests__/use-session-conversation-controller.test.tsx +86 -10
- package/src/features/chat/features/conversation/hooks/__tests__/use-session-conversation-input-state.test.tsx +44 -1
- package/src/features/chat/features/conversation/hooks/use-session-conversation-controller.ts +85 -73
- package/src/features/chat/features/conversation/hooks/use-session-conversation-input-query.ts +5 -15
- package/src/features/chat/features/conversation/hooks/use-session-conversation-input-state.ts +53 -13
- package/src/features/chat/features/conversation/hooks/use-session-submission-recovery.ts +83 -0
- package/src/features/chat/features/conversation/types/session-conversation-input.types.ts +38 -0
- package/src/features/chat/features/input/utils/__tests__/ncp-chat-input-availability.utils.test.ts +1 -29
- package/src/features/chat/features/input/utils/ncp-chat-input-availability.utils.ts +1 -8
- package/src/features/chat/features/message/components/__tests__/chat-message-list-skill-preview.container.test.tsx +14 -1
- package/src/features/chat/features/message/hooks/use-chat-inline-token-actions.ts +7 -2
- package/src/features/chat/features/message/utils/chat-message-execution-summary.utils.ts +3 -0
- package/src/features/chat/features/message/utils/chat-message-texts.utils.ts +1 -0
- package/src/features/chat/features/message/utils/chat-message-trigger-details.utils.ts +3 -0
- package/src/features/chat/features/session/components/chat-sidebar-project-groups.tsx +1 -1
- package/src/features/chat/features/session/components/session-header/chat-session-metadata-dialog.tsx +1 -1
- package/src/features/chat/features/session/components/session-header/chat-session-project-badge.tsx +2 -2
- package/src/features/chat/features/session/utils/__tests__/chat-session-route.utils.test.ts +26 -0
- package/src/features/chat/features/session/utils/chat-session-preference-governance.utils.ts +14 -8
- package/src/features/chat/features/session/utils/chat-session-route.utils.ts +9 -12
- package/src/features/chat/features/welcome/components/__tests__/chat-welcome.test.tsx +31 -6
- package/src/features/chat/features/welcome/components/chat-conversation-welcome.tsx +13 -1
- package/src/features/chat/features/welcome/components/chat-welcome-agent-picker.tsx +1 -1
- package/src/features/chat/features/welcome/components/chat-welcome-project-picker.tsx +1 -1
- package/src/features/chat/features/welcome/components/chat-welcome-prompt-suggestions.tsx +56 -13
- package/src/features/chat/features/welcome/components/chat-welcome-session-type-picker.tsx +3 -3
- package/src/features/chat/features/welcome/components/chat-welcome.tsx +14 -4
- package/src/features/chat/features/welcome/utils/__tests__/chat-welcome-continuation.utils.test.ts +40 -0
- package/src/features/chat/features/welcome/utils/chat-welcome-continuation.utils.ts +21 -0
- package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-file-preview.selection.test.tsx +14 -2
- package/src/features/chat/features/workspace/components/__tests__/session-cron-job-content.test.tsx +5 -1
- package/src/features/chat/features/workspace/components/chat-session-workspace-directory-browser.tsx +1 -1
- package/src/features/chat/features/workspace/components/chat-session-workspace-file-breadcrumbs.tsx +3 -7
- package/src/features/chat/features/workspace/components/chat-session-workspace-file-preview.tsx +6 -5
- package/src/features/chat/features/workspace/components/chat-session-workspace-panel-content.tsx +27 -27
- package/src/features/chat/features/workspace/components/overview/chat-session-continuous-attention.tsx +11 -11
- package/src/features/chat/features/workspace/components/overview/chat-session-token-usage.tsx +15 -15
- 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-new-folder-tree-item.tsx +1 -1
- package/src/features/chat/features/workspace/components/project-files/workspace-project-files-toolbar.tsx +2 -2
- package/src/features/chat/features/workspace/components/session-cron-job-content.tsx +13 -26
- package/src/features/chat/index.ts +1 -0
- package/src/features/chat/pages/__tests__/ncp-chat-page.test.ts +37 -47
- package/src/features/chat/pages/ncp-chat-page.tsx +3 -3
- package/src/features/chat/stores/__tests__/chat-composer-draft.store.test.ts +67 -1
- package/src/features/chat/stores/chat-composer-draft.store.ts +230 -29
- package/src/features/cron/components/__tests__/cron-config.test.tsx +8 -2
- package/src/features/cron/components/cron-config.tsx +6 -17
- package/src/features/cron/components/cron-job-detail-dialog.tsx +10 -9
- package/src/features/cron/components/cron-job-resource.tsx +51 -0
- package/src/features/cron/components/cron-job-row.tsx +5 -4
- package/src/features/cron/index.ts +1 -0
- package/src/features/desktop-capabilities/components/desktop-authorization-dialog.tsx +5 -5
- package/src/features/inbox/components/inbox-reader-dialog.test.tsx +46 -6
- package/src/features/inbox/components/inbox-reader-dialog.tsx +38 -29
- package/src/features/inbox/managers/inbox.manager.test.ts +28 -0
- package/src/features/inbox/managers/inbox.manager.ts +18 -4
- package/src/features/inbox/pages/inbox-page.test.ts +4 -2
- package/src/features/inbox/pages/inbox-page.tsx +14 -10
- package/src/features/marketplace/components/__tests__/marketplace-page-detail.test.tsx +1 -0
- package/src/features/marketplace/components/__tests__/marketplace-page.test.tsx +1 -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 +2 -2
- package/src/features/marketplace/components/mcp/mcp-marketplace-page.tsx +23 -1
- package/src/features/marketplace/hooks/use-marketplace-item-detail.ts +11 -0
- package/src/features/panel-apps/components/panel-app-list-item.tsx +4 -3
- package/src/features/panel-apps/components/panel-app-service-action-authorization-dialog.tsx +2 -2
- package/src/features/panel-apps/index.ts +1 -0
- package/src/features/panel-apps/utils/panel-app-doc-browser.utils.tsx +5 -24
- package/src/features/projects/components/work/project-work-item-drawer.tsx +7 -10
- package/src/features/projects/components/work/project-work-items.tsx +1 -1
- package/src/features/projects/pages/project-home-page.tsx +18 -23
- package/src/features/projects/pages/projects-page.test.tsx +4 -1
- package/src/features/pwa/managers/__tests__/pwa-shell-theme.manager.test.ts +3 -3
- package/src/features/pwa/managers/pwa-shell-theme.manager.ts +8 -3
- package/src/features/right-panel-resources/components/__tests__/page-resource-icon.test.tsx +13 -2
- package/src/features/right-panel-resources/components/__tests__/system-object-resource.test.tsx +74 -6
- package/src/features/right-panel-resources/components/native-object-resource.tsx +134 -0
- package/src/features/right-panel-resources/components/page-resource-icon.tsx +16 -8
- package/src/features/right-panel-resources/components/system-object-resource.tsx +66 -1
- package/src/features/right-panel-resources/components/workspace-file-resource.tsx +9 -0
- package/src/features/right-panel-resources/configs/right-panel-resource-routes.config.ts +11 -21
- package/src/features/right-panel-resources/index.ts +3 -0
- package/src/features/right-panel-resources/managers/__tests__/page-resource.manager.test.ts +14 -4
- package/src/features/right-panel-resources/managers/page-resource.manager.ts +38 -21
- package/src/features/right-panel-resources/utils/__tests__/right-panel-resource-route-resolver.utils.test.ts +17 -0
- package/src/features/right-panel-resources/utils/right-panel-resource-uri.utils.ts +3 -2
- package/src/features/service-apps/components/service-action-row.tsx +4 -3
- package/src/features/service-apps/components/service-app-delete-dialog.tsx +2 -2
- package/src/features/service-apps/components/service-app-list-item.tsx +5 -4
- package/src/features/service-apps/components/service-apps-panel.tsx +5 -2
- package/src/features/settings/components/config/provider-model-suggestions-panel.tsx +1 -1
- package/src/features/settings/pages/providers-config-page.tsx +3 -2
- package/src/index.css +42 -8
- package/src/shared/components/doc-browser/__tests__/doc-browser-context.test.tsx +16 -0
- package/src/shared/components/doc-browser/__tests__/doc-browser.test.tsx +2 -2
- package/src/shared/components/doc-browser/__tests__/resource-link-interceptor.test.tsx +29 -1
- package/src/shared/components/doc-browser/doc-browser-tab-strip.tsx +2 -2
- package/src/shared/components/doc-browser/stores/doc-browser.store.ts +13 -7
- package/src/shared/components/doc-browser/utils/doc-browser-url.utils.ts +2 -1
- package/src/shared/components/path-picker/server-path-picker-dialog.tsx +5 -3
- package/src/shared/components/ui/__tests__/dialog.test.tsx +37 -1
- package/src/shared/components/ui/actions/action-feedback.ts +1 -8
- package/src/shared/components/ui/actions/icon-action-button.tsx +1 -1
- package/src/shared/components/ui/confirm-dialog.tsx +1 -2
- package/src/shared/components/ui/context-menu/context-menu-items.tsx +2 -2
- package/src/shared/components/ui/dialog.tsx +29 -7
- package/src/shared/components/ui/popover.tsx +14 -3
- package/src/shared/components/ui/skeleton.tsx +16 -2
- package/src/shared/components/ui/tab-strip/compact-tab-strip.tsx +2 -2
- package/src/shared/components/ui/tooltip.tsx +2 -1
- package/src/shared/components/workbench/__tests__/workbench-surface.test.tsx +21 -0
- package/src/shared/components/workbench/workbench-surface-toolbar.tsx +4 -0
- package/src/shared/components/workbench/workbench-surface.tsx +4 -1
- package/src/shared/lib/i18n/locales/en-US/chat.json +21 -7
- package/src/shared/lib/i18n/locales/en-US/core.json +5 -1
- package/src/shared/lib/i18n/locales/en-US/doc-browser.json +10 -5
- package/src/shared/lib/i18n/locales/en-US/inbox.json +1 -0
- package/src/shared/lib/i18n/locales/zh-CN/chat.json +21 -7
- package/src/shared/lib/i18n/locales/zh-CN/core.json +5 -1
- package/src/shared/lib/i18n/locales/zh-CN/doc-browser.json +11 -6
- package/src/shared/lib/i18n/locales/zh-CN/inbox.json +1 -0
- package/src/shared/lib/theme/index.test.ts +28 -1
- package/src/shared/lib/theme/index.ts +14 -3
- package/src/shared/lib/transport/__tests__/local-transport.service.test.ts +24 -0
- package/src/shared/lib/transport/local-transport.service.ts +8 -6
- package/dist/assets/account-panel-BAH7FW6z.js +0 -1
- package/dist/assets/api-DjiZvIa0.js +0 -20
- package/dist/assets/app-presenter-provider-CCRFsFYr.js +0 -232
- package/dist/assets/appearance-settings-page-CdP86QJ7.js +0 -1
- package/dist/assets/architecture-TIHT7OUA-CvnC-LeA.js +0 -1
- package/dist/assets/channel-CpMstUPF.js +0 -1
- package/dist/assets/channels-list-page-5qGagKuE.js +0 -8
- package/dist/assets/chunk-2Q5K7J3B-Djp3VF0s.js +0 -1
- package/dist/assets/chunk-VAUOI2AC-BrbiIC1Q.js +0 -1
- package/dist/assets/chunk-XXDRQBXY-Cx9N40wF.js +0 -1
- package/dist/assets/classDiagram-OUVF2IWQ-DFN1v3PQ.js +0 -1
- package/dist/assets/classDiagram-v2-EOCWNBFH-DRvglADa.js +0 -1
- package/dist/assets/config-split-page-CuEGQL8Z.js +0 -1
- package/dist/assets/confirm-dialog-CxfecBzO.js +0 -1
- package/dist/assets/context-menu-BsCj2fRs.js +0 -1
- package/dist/assets/cynefin-VYW2F7L2-DXUGnpJH.js +0 -1
- package/dist/assets/desktop-update-config-e-zhkJuS.js +0 -1
- package/dist/assets/dialog-QjQoKbIV.js +0 -5
- package/dist/assets/doc-browser-CLEdkH9z.js +0 -1
- package/dist/assets/doc-browser-context-DwgG6wrz.js +0 -1
- package/dist/assets/es2015-Bp6cuSGh.js +0 -41
- package/dist/assets/eventmodeling-45OFAUF4-ZBfVS3ZC.js +0 -1
- package/dist/assets/extensions-CgShSIkd.js +0 -1
- package/dist/assets/eye-kisejBFH.js +0 -1
- package/dist/assets/flowDiagram-23GEKE2U-CqdsKk6x.js +0 -1
- package/dist/assets/gitGraph-TEB2WS4Q-fHYFd9Es.js +0 -1
- package/dist/assets/info-DKCQHKI2-CSaOL_bb.js +0 -1
- package/dist/assets/katex-B4FQSo9k.js +0 -1
- package/dist/assets/keyboard-shortcuts-settings-page-DZ8A1iLg.js +0 -1
- package/dist/assets/loader-circle-Bd1fTm-x.js +0 -1
- package/dist/assets/login-page-D99JjH9F.js +0 -1
- package/dist/assets/main-Bt5r6b21.js +0 -2
- package/dist/assets/main-DXd_aKJV.css +0 -1
- package/dist/assets/main-i18n-catalog.config-D0Ll36J_.js +0 -1
- package/dist/assets/mcp-marketplace-page-DUoGfSmY.js +0 -1
- package/dist/assets/model-config-page-9NNf-mzK.js +0 -1
- package/dist/assets/packet-7NZHBO7P-D-YFTczs.js +0 -1
- package/dist/assets/panel-app-BYfQu_TS.js +0 -1
- package/dist/assets/panel-app-i18n-catalog.config-Ddf2Kv8A.js +0 -1
- package/dist/assets/panelStandalone-BRg7B1EI.css +0 -1
- package/dist/assets/panelStandalone-BaUzY8Wy.js +0 -2
- package/dist/assets/pie-RZYD4A2V-VEnYu9s5.js +0 -1
- package/dist/assets/privacy-settings-page-CVMBFuak.js +0 -1
- package/dist/assets/projects-BEsU3box.js +0 -1
- package/dist/assets/provider-models-Dm-pmWAA.js +0 -1
- package/dist/assets/provider-scoped-model-input-CzrXg4cX.js +0 -1
- package/dist/assets/providers-config-page-839uUADZ.js +0 -1
- package/dist/assets/puzzle-BGvD2DPZ.js +0 -1
- package/dist/assets/pwa-DNNK_8E9.js +0 -1
- package/dist/assets/radar-I7S5WNFK-BFNIekC1.js +0 -1
- package/dist/assets/railroad-3IZDKUUU-lVqJ3Hak.js +0 -1
- package/dist/assets/railroad-abnf-AHOZXSZD-DYaefdFC.js +0 -1
- package/dist/assets/railroad-ebnf-EBAXGLYW-CTAk6lVq.js +0 -1
- package/dist/assets/railroad-peg-LSFZ7HO6-Cob294tg.js +0 -1
- package/dist/assets/remote-B5qIuUbT.js +0 -1
- package/dist/assets/runtime-config-page-Bf-4JYxQ.js +0 -1
- package/dist/assets/search-config-page-C0qA3j-T.js +0 -1
- package/dist/assets/secrets-config-page-DxfZWpnk.js +0 -3
- package/dist/assets/security-config-CItfIQZ4.js +0 -1
- package/dist/assets/select-CWyjnar7.js +0 -1
- package/dist/assets/service-apps-panel-D3SOkRVv.js +0 -1
- package/dist/assets/stateDiagram-v2-6OUMAXLB-BrNv-raG.js +0 -1
- package/dist/assets/swimlanesDiagram-G3AALYLV-ntcxaPXp.js +0 -8
- package/dist/assets/tag-chip-BIuavK2K.js +0 -1
- package/dist/assets/theme-provider-CWUz4yO9.js +0 -1
- package/dist/assets/trash-2-hAbJh9VZ.js +0 -1
- package/dist/assets/treeView-QDETBFTQ-DbFmr-gw.js +0 -1
- package/dist/assets/treemap-6X3UGDF4-C8aY96pi.js +0 -1
- package/dist/assets/use-config-evzage09.js +0 -1
- package/dist/assets/use-viewport-layout-D_9XWGDV.js +0 -1
- package/dist/assets/wardley-OPB4EBWU-D8d6DbbJ.js +0 -1
- package/dist/assets/x-ChPbNv39.js +0 -1
- package/src/features/apps/components/app-marketplace-dialog.tsx +0 -168
- /package/dist/assets/{array-BV9OtnO8.js → array-DsNX3jRj.js} +0 -0
- /package/dist/assets/{chunk-KEIR6QF5-Cx-8EJ4_.js → chunk-KEIR6QF5-BOAXXeyv.js} +0 -0
- /package/dist/assets/{chunk-Y2CYZVJY-Dy1ufvjf.js → chunk-Y2CYZVJY-CHjSjwoV.js} +0 -0
- /package/dist/assets/{config-hints-DbmiyTKg.js → config-hints-CaB3I7KP.js} +0 -0
- /package/dist/assets/{cytoscape.esm-CSCjuT4Z.js → cytoscape.esm-j4J9a91l.js} +0 -0
- /package/dist/assets/{defaultLocale-DWTiNsbT.js → defaultLocale-Bmxjp-V_.js} +0 -0
- /package/dist/assets/{dist-BVCSkfWY.js → dist-DwLj1Wg5.js} +0 -0
- /package/dist/assets/{graphlib-B1yb1Wl8.js → graphlib-CC0HTn1v.js} +0 -0
- /package/dist/assets/{host-capabilities-DuIFVsvM.js → host-capabilities-B107nwS3.js} +0 -0
- /package/dist/assets/{init-BF6GH5oe.js → init-Biz9Rus1.js} +0 -0
- /package/dist/assets/{jszip.min-D12teKzP.js → jszip.min-DQvBVV_R.js} +0 -0
- /package/dist/assets/{katex-CsAM73R9.js → katex-BzT-4KBu.js} +0 -0
- /package/dist/assets/{navigation-history-CzErJuPG.js → navigation-history-CCnxsAKR.js} +0 -0
- /package/dist/assets/{path-C56XkznJ.js → path-4azsBPZv.js} +0 -0
- /package/dist/assets/{preload-helper-ca-nBW7U.js → preload-helper-DWTEM3RW.js} +0 -0
- /package/dist/assets/{rough.esm-CGfeEbtE.js → rough.esm-w1lBArN6.js} +0 -0
- /package/dist/assets/{xlsx-sds5nUpL.js → xlsx--SB9KlFl.js} +0 -0
|
@@ -5,8 +5,8 @@ import { cn } from "@/shared/lib/utils";
|
|
|
5
5
|
import { ACTION_FEEDBACK, ACTION_MENU_ITEM_CLASS } from '@/shared/components/ui/actions/action-feedback';
|
|
6
6
|
import type { ContextMenuGroup, ContextMenuItem } from "./context-menu";
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
import { ACTION_MENU_SURFACE_CLASS as CONTEXT_MENU_SURFACE_CLASS } from '@nextclaw/agent-chat-ui';
|
|
9
|
+
export { CONTEXT_MENU_SURFACE_CLASS };
|
|
10
10
|
|
|
11
11
|
function MenuItemContent({ item }: { item: ContextMenuItem }) {
|
|
12
12
|
return <>
|
|
@@ -4,6 +4,8 @@ import { X } from "lucide-react"
|
|
|
4
4
|
|
|
5
5
|
import { cn } from "@/shared/lib/utils"
|
|
6
6
|
import { deferEscapeToNestedMenu } from './context-menu/context-menu';
|
|
7
|
+
import { IconActionButton } from './actions/icon-action-button';
|
|
8
|
+
import { t } from '@/shared/lib/i18n';
|
|
7
9
|
|
|
8
10
|
const Dialog = DialogPrimitive.Root
|
|
9
11
|
|
|
@@ -49,10 +51,6 @@ const DialogContent = React.forwardRef<
|
|
|
49
51
|
}}
|
|
50
52
|
>
|
|
51
53
|
{children}
|
|
52
|
-
<DialogPrimitive.Close className="absolute right-1 top-1 flex h-11 w-11 items-center justify-center rounded-lg opacity-70 transition-all duration-fast hover:bg-[var(--interaction-hover)] hover:text-accent-foreground hover:opacity-100 focus:outline-none focus-visible:ring-1 focus-visible:ring-border disabled:pointer-events-none sm:right-4 sm:top-4 sm:h-6 sm:w-6">
|
|
53
|
-
<X className="h-4 w-4 text-muted-foreground" />
|
|
54
|
-
<span className="sr-only">Close</span>
|
|
55
|
-
</DialogPrimitive.Close>
|
|
56
54
|
</DialogPrimitive.Content>
|
|
57
55
|
</DialogPortal>
|
|
58
56
|
))
|
|
@@ -60,15 +58,39 @@ DialogContent.displayName = DialogPrimitive.Content.displayName
|
|
|
60
58
|
|
|
61
59
|
const DialogHeader = ({
|
|
62
60
|
className,
|
|
61
|
+
children,
|
|
62
|
+
actions,
|
|
63
|
+
showClose = true,
|
|
63
64
|
...props
|
|
64
|
-
}: React.HTMLAttributes<HTMLDivElement>
|
|
65
|
+
}: React.HTMLAttributes<HTMLDivElement> & {
|
|
66
|
+
actions?: React.ReactNode;
|
|
67
|
+
showClose?: boolean;
|
|
68
|
+
}) => (
|
|
65
69
|
<div
|
|
70
|
+
data-slot="dialog-header"
|
|
66
71
|
className={cn(
|
|
67
|
-
"
|
|
72
|
+
"grid shrink-0 grid-cols-[minmax(0,1fr)_auto] items-start gap-3 text-left",
|
|
68
73
|
className
|
|
69
74
|
)}
|
|
70
75
|
{...props}
|
|
71
|
-
|
|
76
|
+
>
|
|
77
|
+
<div className="min-w-0 space-y-2 break-words">{children}</div>
|
|
78
|
+
<div className="flex shrink-0 items-center gap-2" data-slot="dialog-header-controls">
|
|
79
|
+
{actions ? <div className="flex items-center gap-1" data-slot="dialog-header-actions">{actions}</div> : null}
|
|
80
|
+
{showClose ? (
|
|
81
|
+
<div className={cn("flex shrink-0", actions && "pl-2")}>
|
|
82
|
+
<DialogPrimitive.Close asChild>
|
|
83
|
+
<IconActionButton
|
|
84
|
+
size="sm"
|
|
85
|
+
label={t('close')}
|
|
86
|
+
icon={<X className="h-4 w-4" />}
|
|
87
|
+
className="max-md:h-11 max-md:w-11"
|
|
88
|
+
/>
|
|
89
|
+
</DialogPrimitive.Close>
|
|
90
|
+
</div>
|
|
91
|
+
) : null}
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
72
94
|
)
|
|
73
95
|
DialogHeader.displayName = "DialogHeader"
|
|
74
96
|
|
|
@@ -21,8 +21,11 @@ const PopoverAnchor = PopoverPrimitive.Anchor;
|
|
|
21
21
|
|
|
22
22
|
const PopoverContent = React.forwardRef<
|
|
23
23
|
React.ElementRef<typeof PopoverPrimitive.Content>,
|
|
24
|
-
React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> & {
|
|
25
|
-
|
|
24
|
+
React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> & {
|
|
25
|
+
variant?: 'default' | 'menu';
|
|
26
|
+
matchTriggerWidth?: boolean;
|
|
27
|
+
}
|
|
28
|
+
>(({ className, variant = 'default', matchTriggerWidth = false, sideOffset = 8, align = 'start', collisionPadding = 12, style, ...props }, ref) => (
|
|
26
29
|
<PopoverPrimitive.Portal>
|
|
27
30
|
<PopoverPrimitive.Content
|
|
28
31
|
ref={ref}
|
|
@@ -35,7 +38,15 @@ const PopoverContent = React.forwardRef<
|
|
|
35
38
|
className,
|
|
36
39
|
variant === 'menu' && CONTEXT_MENU_SURFACE_CLASS
|
|
37
40
|
)}
|
|
38
|
-
style={{
|
|
41
|
+
style={{
|
|
42
|
+
maxHeight: POPOVER_CONTENT_MAX_HEIGHT,
|
|
43
|
+
...(matchTriggerWidth && {
|
|
44
|
+
width: 'var(--radix-popover-trigger-width)',
|
|
45
|
+
minWidth: 0,
|
|
46
|
+
maxWidth: 'var(--radix-popover-content-available-width)',
|
|
47
|
+
}),
|
|
48
|
+
...style,
|
|
49
|
+
}}
|
|
39
50
|
{...props}
|
|
40
51
|
onEscapeKeyDown={(event) => {
|
|
41
52
|
if (!deferEscapeToNestedMenu(event)) props.onEscapeKeyDown?.(event);
|
|
@@ -6,10 +6,24 @@ function Skeleton({
|
|
|
6
6
|
}: React.HTMLAttributes<HTMLDivElement>) {
|
|
7
7
|
return (
|
|
8
8
|
<div
|
|
9
|
-
|
|
9
|
+
aria-hidden="true"
|
|
10
|
+
className={cn("motion-safe:animate-pulse rounded-md bg-foreground/[0.06]", className)}
|
|
10
11
|
{...props}
|
|
11
12
|
/>
|
|
12
13
|
);
|
|
13
14
|
}
|
|
14
15
|
|
|
15
|
-
|
|
16
|
+
function SkeletonContent({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {
|
|
17
|
+
return (
|
|
18
|
+
<div className={cn("flex items-start gap-3 py-5", className)} aria-hidden="true" {...props}>
|
|
19
|
+
<Skeleton className="h-10 w-10 shrink-0 rounded-xl" />
|
|
20
|
+
<div className="min-w-0 flex-1 space-y-3 pt-1">
|
|
21
|
+
<Skeleton className="h-3.5 w-28 max-w-[55%]" />
|
|
22
|
+
<Skeleton className="h-2.5 w-3/4 max-w-72" />
|
|
23
|
+
<Skeleton className="h-2.5 w-1/2 max-w-48" />
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export { Skeleton, SkeletonContent };
|
|
@@ -204,7 +204,7 @@ function CompactTabLabelButton({
|
|
|
204
204
|
<TooltipProvider delayDuration={250}>
|
|
205
205
|
<Tooltip>
|
|
206
206
|
<TooltipTrigger asChild>{button}</TooltipTrigger>
|
|
207
|
-
<TooltipContent
|
|
207
|
+
<TooltipContent className="text-xs">
|
|
208
208
|
{tooltip}
|
|
209
209
|
</TooltipContent>
|
|
210
210
|
</Tooltip>
|
|
@@ -287,7 +287,7 @@ export function CompactTabStrip({
|
|
|
287
287
|
>
|
|
288
288
|
<div
|
|
289
289
|
className={cn(
|
|
290
|
-
"flex min-w-0 flex-1 items-stretch overflow-x-auto overflow-y-hidden",
|
|
290
|
+
"compact-tab-scrollbar flex min-w-0 flex-1 items-stretch overflow-x-auto overflow-y-hidden",
|
|
291
291
|
scrollClassName,
|
|
292
292
|
)}
|
|
293
293
|
onPointerDown={onScrollPointerDown}
|
|
@@ -27,12 +27,13 @@ TooltipTrigger.displayName = TooltipPrimitive.Trigger.displayName;
|
|
|
27
27
|
const TooltipContent = React.forwardRef<
|
|
28
28
|
React.ElementRef<typeof TooltipPrimitive.Content>,
|
|
29
29
|
React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>
|
|
30
|
-
>(({ className, sideOffset = 4, ...props }, ref) => (
|
|
30
|
+
>(({ className, side = 'top', sideOffset = 4, ...props }, ref) => (
|
|
31
31
|
<TooltipPrimitive.Portal>
|
|
32
32
|
<TooltipPrimitive.Content
|
|
33
33
|
ref={ref}
|
|
34
34
|
data-theme-overlay="tooltip"
|
|
35
35
|
sideOffset={sideOffset}
|
|
36
|
+
side={side}
|
|
36
37
|
className={cn(
|
|
37
38
|
'z-[var(--z-tooltip,10150)] overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
|
|
38
39
|
className
|
|
@@ -13,6 +13,27 @@ beforeEach(() => {
|
|
|
13
13
|
});
|
|
14
14
|
});
|
|
15
15
|
|
|
16
|
+
it("keeps more actions immediately before close across window states", () => {
|
|
17
|
+
render(<WorkbenchSurface id="resource" manager={manager} title="A long session title"
|
|
18
|
+
onClose={vi.fn()} onOpenMain={vi.fn()} moreActions={<button>More actions</button>}>
|
|
19
|
+
<textarea aria-label="Draft" />
|
|
20
|
+
</WorkbenchSurface>);
|
|
21
|
+
const assertOrder = () => {
|
|
22
|
+
const toolbar = screen.getByRole("button", { name: "More actions" }).parentElement!;
|
|
23
|
+
const buttons = within(toolbar).getAllByRole("button");
|
|
24
|
+
expect(buttons.slice(-2).map((button) => button.getAttribute("aria-label") || button.textContent))
|
|
25
|
+
.toEqual(["More actions", "Close view"]);
|
|
26
|
+
};
|
|
27
|
+
assertOrder();
|
|
28
|
+
fireEvent.click(screen.getByRole("button", { name: "Float view group" }));
|
|
29
|
+
assertOrder();
|
|
30
|
+
fireEvent.click(screen.getByRole("button", { name: "Collapse view" }));
|
|
31
|
+
assertOrder();
|
|
32
|
+
fireEvent.click(screen.getByRole("button", { name: "Expand view" }));
|
|
33
|
+
expect(screen.getByTitle("A long session title")).toBeTruthy();
|
|
34
|
+
assertOrder();
|
|
35
|
+
});
|
|
36
|
+
|
|
16
37
|
it("retains the exact input and iframe nodes through every presentation transition and hiding", () => {
|
|
17
38
|
const props = {
|
|
18
39
|
id: "resource",
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
PictureInPicture2,
|
|
8
8
|
X,
|
|
9
9
|
} from "lucide-react";
|
|
10
|
+
import type { ReactNode } from "react";
|
|
10
11
|
import { IconActionButton, IconActionGroup } from "@/shared/components/ui/actions/icon-action-button";
|
|
11
12
|
import { t } from "@/shared/lib/i18n";
|
|
12
13
|
import type { WorkbenchSurfaceState } from "./types/workbench-surface.types";
|
|
@@ -21,6 +22,7 @@ export function WorkbenchSurfaceToolbar({
|
|
|
21
22
|
onClose,
|
|
22
23
|
closeLabel,
|
|
23
24
|
onOpenMain,
|
|
25
|
+
moreActions,
|
|
24
26
|
}: {
|
|
25
27
|
state: WorkbenchSurfaceState;
|
|
26
28
|
compact: boolean;
|
|
@@ -31,6 +33,7 @@ export function WorkbenchSurfaceToolbar({
|
|
|
31
33
|
onClose: () => void;
|
|
32
34
|
closeLabel: string;
|
|
33
35
|
onOpenMain?: () => void;
|
|
36
|
+
moreActions?: ReactNode;
|
|
34
37
|
}) {
|
|
35
38
|
return (
|
|
36
39
|
<IconActionGroup
|
|
@@ -90,6 +93,7 @@ export function WorkbenchSurfaceToolbar({
|
|
|
90
93
|
onClick={onMaximize}
|
|
91
94
|
/>
|
|
92
95
|
)}
|
|
96
|
+
{moreActions}
|
|
93
97
|
<IconActionButton
|
|
94
98
|
size="sm"
|
|
95
99
|
icon={<X className="h-4 w-4" />}
|
|
@@ -22,6 +22,7 @@ type WorkbenchSurfaceProps = {
|
|
|
22
22
|
title: string;
|
|
23
23
|
children: ReactNode;
|
|
24
24
|
navigation?: ReactNode;
|
|
25
|
+
moreActions?: ReactNode;
|
|
25
26
|
icon?: ReactNode;
|
|
26
27
|
onClose: () => void;
|
|
27
28
|
closeLabel?: string;
|
|
@@ -67,6 +68,7 @@ export function WorkbenchSurface({
|
|
|
67
68
|
title,
|
|
68
69
|
icon,
|
|
69
70
|
navigation,
|
|
71
|
+
moreActions,
|
|
70
72
|
children,
|
|
71
73
|
onClose,
|
|
72
74
|
closeLabel = t("workbenchCloseView"),
|
|
@@ -290,7 +292,7 @@ export function WorkbenchSurface({
|
|
|
290
292
|
)}
|
|
291
293
|
>
|
|
292
294
|
{icon}
|
|
293
|
-
<span className="truncate">{title}</span>
|
|
295
|
+
<span className="truncate" title={title}>{title}</span>
|
|
294
296
|
</span>
|
|
295
297
|
<WorkbenchSurfaceToolbar
|
|
296
298
|
state={state}
|
|
@@ -308,6 +310,7 @@ export function WorkbenchSurface({
|
|
|
308
310
|
onClose={close}
|
|
309
311
|
closeLabel={closeLabel}
|
|
310
312
|
onOpenMain={onOpenMain}
|
|
313
|
+
moreActions={moreActions}
|
|
311
314
|
/>
|
|
312
315
|
</header>
|
|
313
316
|
<div
|
|
@@ -362,7 +362,7 @@
|
|
|
362
362
|
"chatRuntimeInitializationFailed": "Chat startup failed. Please retry in a moment or inspect the service logs.",
|
|
363
363
|
"chatInputPlaceholder": "Type a message, / for commands, apps or skills, @ for files, folders, projects or panel apps, Enter to send, Shift + Enter for newline",
|
|
364
364
|
"chatInputPlaceholderCompact": "Message NextClaw...",
|
|
365
|
-
"chatWelcomeInputPlaceholder": "
|
|
365
|
+
"chatWelcomeInputPlaceholder": "Share what you want to do, or what’s on your mind…",
|
|
366
366
|
"chatInputHint": "Multi-turn context is preserved in the current session.",
|
|
367
367
|
"chatSlashSection": "Slash menu",
|
|
368
368
|
"chatSlashSectionCommands": "Commands",
|
|
@@ -558,6 +558,14 @@
|
|
|
558
558
|
"chatSessionErrorTitle": "Something went wrong",
|
|
559
559
|
"chatSessionActivityInterrupted": "The run was interrupted. Send the message again.",
|
|
560
560
|
"chatSendFailed": "Failed to send message",
|
|
561
|
+
"chatSubmissionSending": "Checking whether the message was received…",
|
|
562
|
+
"chatSendResultUnknown": "The send result is unknown. Check the session, then retry the original request.",
|
|
563
|
+
"chatSendResultUnknownChild": "The send result is unknown. Check child sessions first; a safe retry is unavailable here.",
|
|
564
|
+
"chatSubmissionRejected": "The message was not accepted. You can restore it and retry.",
|
|
565
|
+
"chatSubmissionRetry": "Check and retry original request",
|
|
566
|
+
"chatSubmissionRestore": "Restore message",
|
|
567
|
+
"chatSubmissionDiscard": "Discard failed message",
|
|
568
|
+
"chatSubmissionDiscardConfirm": "Discard this failed message? You cannot undo this action.",
|
|
561
569
|
"chatRoleUser": "You",
|
|
562
570
|
"chatRoleAssistant": "Assistant",
|
|
563
571
|
"chatRoleTool": "Tool",
|
|
@@ -609,6 +617,7 @@
|
|
|
609
617
|
"chatMessageCopied": "Copied",
|
|
610
618
|
"chatMermaidDiagram": "Diagram",
|
|
611
619
|
"chatMarkdownFrontmatter": "Document properties",
|
|
620
|
+
"chatMarkdownDetails": "Details",
|
|
612
621
|
"chatMermaidExpand": "Expand diagram",
|
|
613
622
|
"chatMermaidLoading": "Rendering diagram…",
|
|
614
623
|
"chatMermaidRenderError": "Diagram could not be rendered; showing source instead",
|
|
@@ -653,7 +662,7 @@
|
|
|
653
662
|
"chatPanelDock": "Dock to right sidebar",
|
|
654
663
|
"chatPanelOpen": "Chat in right sidebar",
|
|
655
664
|
"chatPanelUnavailable": "This conversation cannot be opened. Open it again from the conversation list.",
|
|
656
|
-
"chatWelcomeTitle": "
|
|
665
|
+
"chatWelcomeTitle": "Where shall we start today?",
|
|
657
666
|
"chatWelcomeContextLabel": "Task context",
|
|
658
667
|
"chatWelcomeProjectPickerLabel": "Choose working directory",
|
|
659
668
|
"chatWelcomeProjectPickerPlaceholder": "Choose working directory",
|
|
@@ -662,12 +671,17 @@
|
|
|
662
671
|
"chatWelcomeProjectNoRecent": "No recent projects yet",
|
|
663
672
|
"chatWelcomeProjectOpenFolder": "Open folder",
|
|
664
673
|
"chatWelcomeSessionTypePickerLabel": "Choose session type",
|
|
665
|
-
"chatWelcomeSuggestion1Label": "
|
|
674
|
+
"chatWelcomeSuggestion1Label": "Move this project forward",
|
|
675
|
+
"chatWelcomeContinueLabel": "Pick up where you left off",
|
|
676
|
+
"chatWelcomeContinueHint": "Return to the original conversation with its context",
|
|
677
|
+
"chatWelcomeDismissContinue": "Hide this conversation suggestion for now",
|
|
678
|
+
"chatWelcomeOpenStartLabel": "Talk about how I’ve been",
|
|
679
|
+
"chatWelcomeOpenStartPrompt": "I'd like to talk about how things have been lately. Listen to what I have been experiencing and what matters to me. We can take our time without rushing into advice or a task list.",
|
|
666
680
|
"chatWelcomeSuggestion1Prompt": "Help me understand this project and propose the next three concrete things we should build.",
|
|
667
|
-
"chatWelcomeSuggestion2Label": "
|
|
668
|
-
"chatWelcomeSuggestion2Prompt": "
|
|
669
|
-
"chatWelcomeSuggestion3Label": "
|
|
670
|
-
"chatWelcomeSuggestion3Prompt": "
|
|
681
|
+
"chatWelcomeSuggestion2Label": "Help me think through an idea",
|
|
682
|
+
"chatWelcomeSuggestion2Prompt": "I have an idea that is still taking shape. Hear me out, then help me explore its possibilities, open questions, and potential directions.",
|
|
683
|
+
"chatWelcomeSuggestion3Label": "Start something together",
|
|
684
|
+
"chatWelcomeSuggestion3Prompt": "There is something I would like us to work on together. Let me explain what I have in mind and what materials I have, then we can decide where to begin.",
|
|
671
685
|
"chatSkillsPickerTitle": "Skills",
|
|
672
686
|
"chatSkillsPickerEmpty": "No skills installed",
|
|
673
687
|
"chatSkillsPickerSearchPlaceholder": "Search skills",
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
+
"close": "Close",
|
|
2
3
|
"refresh": "Refresh",
|
|
3
4
|
"chat": "Chat",
|
|
4
5
|
"model": "Model",
|
|
@@ -100,7 +101,10 @@
|
|
|
100
101
|
"language": "Language",
|
|
101
102
|
"theme": "Theme",
|
|
102
103
|
"themeNatural": "Natural",
|
|
103
|
-
"
|
|
104
|
+
"themeDefault": "Default",
|
|
105
|
+
"themePaperInk": "Paper & Ink",
|
|
106
|
+
"themePlainPaper": "Plain Paper",
|
|
107
|
+
"themeWork": "Soft White",
|
|
104
108
|
"themeMinimal": "Minimal",
|
|
105
109
|
"themeWarm": "Paper",
|
|
106
110
|
"themeCool": "Mist",
|
|
@@ -38,9 +38,13 @@
|
|
|
38
38
|
"appPackagesNoDataYet": "No data yet",
|
|
39
39
|
"appPackagesLoadFailed": "Failed to load apps",
|
|
40
40
|
"appPackagesRefresh": "Refresh apps",
|
|
41
|
+
"appPackagesOpen": "Open",
|
|
42
|
+
"appPackagesDetails": "App details",
|
|
43
|
+
"appPackagesMarketplaceSource": "Browse app marketplace",
|
|
44
|
+
"appPackagesCustomSource": "Install from a source",
|
|
41
45
|
"appPackagesBrowse": "Add apps",
|
|
42
|
-
"appPackagesMarketplaceTitle": "
|
|
43
|
-
"appPackagesMarketplaceDescription": "
|
|
46
|
+
"appPackagesMarketplaceTitle": "App marketplace",
|
|
47
|
+
"appPackagesMarketplaceDescription": "Discover apps that make your everyday work easier.",
|
|
44
48
|
"appPackagesMarketplaceSearch": "Search apps, features, or tags",
|
|
45
49
|
"appPackagesMarketplaceLoading": "Loading the app marketplace…",
|
|
46
50
|
"appPackagesMarketplaceLoadMore": "Load more",
|
|
@@ -75,7 +79,6 @@
|
|
|
75
79
|
"appPackagesAllPlatforms": "All platforms",
|
|
76
80
|
"appPackagesPlatformOnly": "{platforms} only",
|
|
77
81
|
"appPackagesUnavailableOnDevice": "Unavailable on this device",
|
|
78
|
-
"appPackagesUnavailable": "Unavailable",
|
|
79
82
|
"appPackagesTemporarilyUnavailable": "Temporarily unavailable",
|
|
80
83
|
"appPackagesCompatibilityUnknown": "Compatibility could not be confirmed",
|
|
81
84
|
"appPackagesCompatibilityUnknownReason": "NextClaw could not confirm whether this app supports this device. Refresh and try again.",
|
|
@@ -104,7 +107,7 @@
|
|
|
104
107
|
"appPackagesFilterAll": "All",
|
|
105
108
|
"appPackagesFilterPersonal": "Personal",
|
|
106
109
|
"appPackagesFilterLocal": "Local-first",
|
|
107
|
-
"appPackagesBackToMarketplace": "Back to
|
|
110
|
+
"appPackagesBackToMarketplace": "Back to marketplace",
|
|
108
111
|
"appPackagesAboutApp": "About this app",
|
|
109
112
|
"appPackagesPanelsAdded": "App views",
|
|
110
113
|
"appPackagesServicesAdded": "Local services",
|
|
@@ -211,5 +214,7 @@
|
|
|
211
214
|
"appPackagesDocumentAccessChooseDescription": "Choose the folder this app may access.",
|
|
212
215
|
"appPackagesDocumentAccessPath": "Granted folder",
|
|
213
216
|
"appPackagesDocumentAccessWriteWarning": "Read and write access lets this app modify the original files in this folder. You can revoke it from the app card at any time.",
|
|
214
|
-
"appPackagesDocumentAccessReadHint": "Read-only access lets this app view the folder but not modify files through this mount."
|
|
217
|
+
"appPackagesDocumentAccessReadHint": "Read-only access lets this app view the folder but not modify files through this mount.",
|
|
218
|
+
"appPackagesViewInstalled": "View installed",
|
|
219
|
+
"appPackagesClearSearch": "Clear search"
|
|
215
220
|
}
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
"inboxRestore": "Restore",
|
|
21
21
|
"inboxDelete": "Delete",
|
|
22
22
|
"inboxContinueChat": "Continue in chat",
|
|
23
|
+
"inboxContinueChatCompact": "Continue",
|
|
23
24
|
"inboxDeleteTitle": "Delete this item?",
|
|
24
25
|
"inboxDeleteDescription": "It cannot be recovered from Inbox. Any chat already created will remain.",
|
|
25
26
|
"inboxDeleteConfirm": "Delete",
|
|
@@ -362,7 +362,7 @@
|
|
|
362
362
|
"chatRuntimeInitializationFailed": "聊天能力启动失败,请稍后重试或检查服务日志。",
|
|
363
363
|
"chatInputPlaceholder": "输入消息,/ 选命令、应用或技能,@ 引用文件、文件夹、项目或面板应用,Enter 发送,Shift + Enter 换行",
|
|
364
364
|
"chatInputPlaceholderCompact": "发消息...",
|
|
365
|
-
"chatWelcomeInputPlaceholder": "
|
|
365
|
+
"chatWelcomeInputPlaceholder": "说说你想做的事,或正在想的问题……",
|
|
366
366
|
"chatInputHint": "支持多轮上下文,默认走当前会话。",
|
|
367
367
|
"chatSlashSection": "斜杠菜单",
|
|
368
368
|
"chatSlashSectionCommands": "命令",
|
|
@@ -558,6 +558,14 @@
|
|
|
558
558
|
"chatSessionErrorTitle": "出错了",
|
|
559
559
|
"chatSessionActivityInterrupted": "运行意外中断,请重新发送消息。",
|
|
560
560
|
"chatSendFailed": "发送消息失败",
|
|
561
|
+
"chatSubmissionSending": "正在确认消息是否已接收…",
|
|
562
|
+
"chatSendResultUnknown": "发送结果尚未确认。请先检查会话消息,再用原请求重试。",
|
|
563
|
+
"chatSendResultUnknownChild": "发送结果尚未确认。请先检查子会话消息;当前无法安全重试。",
|
|
564
|
+
"chatSubmissionRejected": "消息未被接收。可恢复原内容后重试。",
|
|
565
|
+
"chatSubmissionRetry": "查询并重试原请求",
|
|
566
|
+
"chatSubmissionRestore": "恢复原内容",
|
|
567
|
+
"chatSubmissionDiscard": "丢弃失败内容",
|
|
568
|
+
"chatSubmissionDiscardConfirm": "确定丢弃这条失败消息的内容吗?此操作无法撤销。",
|
|
561
569
|
"chatRoleUser": "你",
|
|
562
570
|
"chatRoleAssistant": "助手",
|
|
563
571
|
"chatRoleTool": "工具",
|
|
@@ -609,6 +617,7 @@
|
|
|
609
617
|
"chatMessageCopied": "已复制",
|
|
610
618
|
"chatMermaidDiagram": "图表",
|
|
611
619
|
"chatMarkdownFrontmatter": "文档属性",
|
|
620
|
+
"chatMarkdownDetails": "详细内容",
|
|
612
621
|
"chatMermaidExpand": "放大图表",
|
|
613
622
|
"chatMermaidLoading": "正在渲染图表…",
|
|
614
623
|
"chatMermaidRenderError": "图表无法渲染,已显示源代码",
|
|
@@ -653,7 +662,7 @@
|
|
|
653
662
|
"chatPanelDock": "停靠到右侧栏",
|
|
654
663
|
"chatPanelOpen": "在右侧栏中对话",
|
|
655
664
|
"chatPanelUnavailable": "无法打开此会话,请从会话列表重新打开。",
|
|
656
|
-
"chatWelcomeTitle": "
|
|
665
|
+
"chatWelcomeTitle": "今天,想从哪里开始?",
|
|
657
666
|
"chatWelcomeContextLabel": "任务上下文",
|
|
658
667
|
"chatWelcomeProjectPickerLabel": "选择工作目录",
|
|
659
668
|
"chatWelcomeProjectPickerPlaceholder": "选择工作目录",
|
|
@@ -662,12 +671,17 @@
|
|
|
662
671
|
"chatWelcomeProjectNoRecent": "暂无最近项目",
|
|
663
672
|
"chatWelcomeProjectOpenFolder": "打开文件夹",
|
|
664
673
|
"chatWelcomeSessionTypePickerLabel": "选择会话类型",
|
|
665
|
-
"
|
|
674
|
+
"chatWelcomeContinueLabel": "接着上次的话题",
|
|
675
|
+
"chatWelcomeContinueHint": "回到原会话,接着之前的上下文继续",
|
|
676
|
+
"chatWelcomeDismissContinue": "暂时收起这条会话建议",
|
|
677
|
+
"chatWelcomeOpenStartLabel": "聊聊我最近的状态",
|
|
678
|
+
"chatWelcomeOpenStartPrompt": "想和你聊聊最近的近况。先听听我最近在经历什么、在意什么,我们慢慢聊,不用急着给建议或安排任务。",
|
|
679
|
+
"chatWelcomeSuggestion1Label": "推进这个项目",
|
|
666
680
|
"chatWelcomeSuggestion1Prompt": "帮我理解当前项目,并给出接下来最值得推进的三个具体建设方向。",
|
|
667
|
-
"chatWelcomeSuggestion2Label": "
|
|
668
|
-
"chatWelcomeSuggestion2Prompt": "
|
|
669
|
-
"chatWelcomeSuggestion3Label": "
|
|
670
|
-
"chatWelcomeSuggestion3Prompt": "
|
|
681
|
+
"chatWelcomeSuggestion2Label": "帮我理清一个想法",
|
|
682
|
+
"chatWelcomeSuggestion2Prompt": "我有个还没想成熟的想法,想和你一起讨论。先听我说,再帮我看看其中的机会、疑问和可能的方向。",
|
|
683
|
+
"chatWelcomeSuggestion3Label": "一起开始做一件事",
|
|
684
|
+
"chatWelcomeSuggestion3Prompt": "有件事想和你一起做。先让我说说想做什么、目前有什么材料,再一起确定从哪里开始。",
|
|
671
685
|
"chatSkillsPickerTitle": "技能",
|
|
672
686
|
"chatSkillsPickerEmpty": "暂无已安装技能",
|
|
673
687
|
"chatSkillsPickerSearchPlaceholder": "搜索技能",
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
+
"close": "关闭",
|
|
2
3
|
"refresh": "刷新",
|
|
3
4
|
"chat": "对话",
|
|
4
5
|
"model": "模型",
|
|
@@ -100,7 +101,10 @@
|
|
|
100
101
|
"language": "语言",
|
|
101
102
|
"theme": "主题",
|
|
102
103
|
"themeNatural": "自然",
|
|
103
|
-
"
|
|
104
|
+
"themeDefault": "默认",
|
|
105
|
+
"themePaperInk": "纸墨",
|
|
106
|
+
"themePlainPaper": "素笺",
|
|
107
|
+
"themeWork": "素白",
|
|
104
108
|
"themeMinimal": "简白",
|
|
105
109
|
"themeWarm": "纸暖",
|
|
106
110
|
"themeCool": "雾蓝",
|
|
@@ -38,9 +38,13 @@
|
|
|
38
38
|
"appPackagesNoDataYet": "尚无数据",
|
|
39
39
|
"appPackagesLoadFailed": "应用加载失败",
|
|
40
40
|
"appPackagesRefresh": "刷新应用",
|
|
41
|
+
"appPackagesOpen": "打开",
|
|
42
|
+
"appPackagesDetails": "应用详情",
|
|
43
|
+
"appPackagesMarketplaceSource": "浏览应用市场",
|
|
44
|
+
"appPackagesCustomSource": "从指定来源安装",
|
|
41
45
|
"appPackagesBrowse": "添加应用",
|
|
42
|
-
"appPackagesMarketplaceTitle": "
|
|
43
|
-
"appPackagesMarketplaceDescription": "
|
|
46
|
+
"appPackagesMarketplaceTitle": "应用市场",
|
|
47
|
+
"appPackagesMarketplaceDescription": "发现适合你的应用,让日常工作更顺手。",
|
|
44
48
|
"appPackagesMarketplaceSearch": "搜索应用、功能或标签",
|
|
45
49
|
"appPackagesMarketplaceLoading": "正在加载应用市场…",
|
|
46
50
|
"appPackagesMarketplaceLoadMore": "加载更多",
|
|
@@ -62,7 +66,7 @@
|
|
|
62
66
|
"appPackagesEmptyTitle": "还没有可用应用",
|
|
63
67
|
"appPackagesEmptyDescription": "安装一个 Mini APP,或升级到包含内置应用的 NextClaw 版本。",
|
|
64
68
|
"appPackagesEnabled": "已启用",
|
|
65
|
-
"appPackagesUnavailable": "
|
|
69
|
+
"appPackagesUnavailable": "无法安装",
|
|
66
70
|
"appPackagesAvailable": "可用",
|
|
67
71
|
"appPackagesNeedsCapability": "需要额外能力",
|
|
68
72
|
"appPackagesNeedsConfiguration": "需要完成设置",
|
|
@@ -75,7 +79,6 @@
|
|
|
75
79
|
"appPackagesAllPlatforms": "全部平台",
|
|
76
80
|
"appPackagesPlatformOnly": "仅支持 {platforms}",
|
|
77
81
|
"appPackagesUnavailableOnDevice": "这台设备无法安装",
|
|
78
|
-
"appPackagesUnavailable": "无法安装",
|
|
79
82
|
"appPackagesTemporarilyUnavailable": "暂无法安装",
|
|
80
83
|
"appPackagesCompatibilityUnknown": "暂时无法确认兼容性",
|
|
81
84
|
"appPackagesCompatibilityUnknownReason": "NextClaw 暂时无法确认这台设备是否支持此应用,请刷新后再试。",
|
|
@@ -104,7 +107,7 @@
|
|
|
104
107
|
"appPackagesFilterAll": "全部",
|
|
105
108
|
"appPackagesFilterPersonal": "个人",
|
|
106
109
|
"appPackagesFilterLocal": "本地优先",
|
|
107
|
-
"appPackagesBackToMarketplace": "
|
|
110
|
+
"appPackagesBackToMarketplace": "返回应用市场",
|
|
108
111
|
"appPackagesAboutApp": "关于这个应用",
|
|
109
112
|
"appPackagesPanelsAdded": "可打开的界面",
|
|
110
113
|
"appPackagesServicesAdded": "本机服务",
|
|
@@ -211,5 +214,7 @@
|
|
|
211
214
|
"appPackagesDocumentAccessChooseDescription": "选择此应用可以访问的目录。",
|
|
212
215
|
"appPackagesDocumentAccessPath": "授权目录",
|
|
213
216
|
"appPackagesDocumentAccessWriteWarning": "读写授权允许应用直接修改这个目录中的原始文件;你可以随时在应用卡片中撤销。",
|
|
214
|
-
"appPackagesDocumentAccessReadHint": "只读授权允许应用查看这个目录,但不能通过此挂载修改文件。"
|
|
217
|
+
"appPackagesDocumentAccessReadHint": "只读授权允许应用查看这个目录,但不能通过此挂载修改文件。",
|
|
218
|
+
"appPackagesViewInstalled": "查看已安装",
|
|
219
|
+
"appPackagesClearSearch": "清除搜索"
|
|
215
220
|
}
|
|
@@ -4,6 +4,8 @@ import {
|
|
|
4
4
|
getThemeAppearance,
|
|
5
5
|
normalizeTheme,
|
|
6
6
|
resolveInitialTheme,
|
|
7
|
+
resolveTheme,
|
|
8
|
+
setTheme,
|
|
7
9
|
THEME_OPTIONS,
|
|
8
10
|
} from './index';
|
|
9
11
|
|
|
@@ -13,7 +15,7 @@ describe('ui theme defaults', () => {
|
|
|
13
15
|
});
|
|
14
16
|
|
|
15
17
|
it('uses the default theme when no preference is saved', () => {
|
|
16
|
-
expect(DEFAULT_UI_THEME).toBe('
|
|
18
|
+
expect(DEFAULT_UI_THEME).toBe('default');
|
|
17
19
|
expect(resolveInitialTheme()).toBe(DEFAULT_UI_THEME);
|
|
18
20
|
});
|
|
19
21
|
|
|
@@ -21,6 +23,31 @@ describe('ui theme defaults', () => {
|
|
|
21
23
|
expect(THEME_OPTIONS[0]?.value).toBe(DEFAULT_UI_THEME);
|
|
22
24
|
});
|
|
23
25
|
|
|
26
|
+
it('renders the alias identically while preserving the selected preference', () => {
|
|
27
|
+
setTheme('work');
|
|
28
|
+
setTheme('default');
|
|
29
|
+
expect(document.documentElement.getAttribute('data-theme')).toBe('plain-paper');
|
|
30
|
+
expect(window.localStorage.getItem('nextclaw.ui.theme')).toBe('default');
|
|
31
|
+
expect(resolveInitialTheme()).toBe('default');
|
|
32
|
+
setTheme('plain-paper');
|
|
33
|
+
expect(document.documentElement.getAttribute('data-theme')).toBe('plain-paper');
|
|
34
|
+
expect(window.localStorage.getItem('nextclaw.ui.theme')).toBe('plain-paper');
|
|
35
|
+
expect(resolveTheme('default')).toBe('plain-paper');
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('keeps paper ink available independently of the default', () => {
|
|
39
|
+
setTheme('paper-ink');
|
|
40
|
+
expect(document.documentElement.getAttribute('data-theme')).toBe('paper-ink');
|
|
41
|
+
expect(resolveInitialTheme()).toBe('paper-ink');
|
|
42
|
+
expect(THEME_OPTIONS).toContainEqual({ value: 'paper-ink', labelKey: 'themePaperInk' });
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('preserves the old default as a named theme', () => {
|
|
46
|
+
window.localStorage.setItem('nextclaw.ui.theme', 'work');
|
|
47
|
+
expect(resolveInitialTheme()).toBe('work');
|
|
48
|
+
expect(THEME_OPTIONS).toContainEqual({ value: 'work', labelKey: 'themeWork' });
|
|
49
|
+
});
|
|
50
|
+
|
|
24
51
|
it('recognizes charcoal as a dark theme', () => {
|
|
25
52
|
expect(normalizeTheme('charcoal')).toBe('charcoal');
|
|
26
53
|
expect(getThemeAppearance('charcoal')).toBe('dark');
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
export type UiTheme =
|
|
2
|
+
| 'default'
|
|
3
|
+
| 'paper-ink'
|
|
4
|
+
| 'plain-paper'
|
|
2
5
|
| 'natural'
|
|
3
6
|
| 'work'
|
|
4
7
|
| 'minimal'
|
|
@@ -19,9 +22,17 @@ type UiThemeDefinition = {
|
|
|
19
22
|
};
|
|
20
23
|
|
|
21
24
|
const THEME_STORAGE_KEY = 'nextclaw.ui.theme';
|
|
22
|
-
export const DEFAULT_UI_THEME: UiTheme = '
|
|
25
|
+
export const DEFAULT_UI_THEME: UiTheme = 'default';
|
|
26
|
+
export const DEFAULT_THEME_TARGET = 'plain-paper';
|
|
27
|
+
|
|
28
|
+
export function resolveTheme(theme: UiTheme): Exclude<UiTheme, 'default'> {
|
|
29
|
+
return theme === 'default' ? DEFAULT_THEME_TARGET : theme;
|
|
30
|
+
}
|
|
23
31
|
|
|
24
32
|
const THEME_DEFINITIONS: readonly UiThemeDefinition[] = [
|
|
33
|
+
{ value: 'default', labelKey: 'themeDefault', appearance: 'light' },
|
|
34
|
+
{ value: 'plain-paper', labelKey: 'themePlainPaper', appearance: 'light' },
|
|
35
|
+
{ value: 'paper-ink', labelKey: 'themePaperInk', appearance: 'light' },
|
|
25
36
|
{ value: 'work', labelKey: 'themeWork', appearance: 'light' },
|
|
26
37
|
{ value: 'night', labelKey: 'themeNight', appearance: 'dark' },
|
|
27
38
|
{ value: 'charcoal', labelKey: 'themeCharcoal', appearance: 'dark' },
|
|
@@ -59,7 +70,7 @@ export function normalizeTheme(value: unknown): UiTheme | null {
|
|
|
59
70
|
|
|
60
71
|
export function getThemeAppearance(theme: UiTheme): UiThemeAppearance {
|
|
61
72
|
return (
|
|
62
|
-
THEME_DEFINITIONS.find((definition) => definition.value === theme)
|
|
73
|
+
THEME_DEFINITIONS.find((definition) => definition.value === resolveTheme(theme))
|
|
63
74
|
?.appearance ?? 'light'
|
|
64
75
|
);
|
|
65
76
|
}
|
|
@@ -123,7 +134,7 @@ class UiThemeOwner {
|
|
|
123
134
|
return;
|
|
124
135
|
}
|
|
125
136
|
const appearance = getThemeAppearance(theme);
|
|
126
|
-
document.documentElement.setAttribute('data-theme', theme);
|
|
137
|
+
document.documentElement.setAttribute('data-theme', resolveTheme(theme));
|
|
127
138
|
document.documentElement.setAttribute('data-theme-appearance', appearance);
|
|
128
139
|
document.documentElement.style.colorScheme = appearance;
|
|
129
140
|
};
|