@saluzi/saluzi-edu 0.2.59 → 0.2.61
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/dist/cli.js +362 -120
- package/dist/guide/guide-data.json +5 -1
- package/dist/parade/web/cube.js +403 -81
- package/dist/parade/web/index.html +172 -41
- package/dist/parade/web/menu.html +195 -0
- package/dist/rcs-web/assets/{AdminPanel-CbcZ7Vnr.js → AdminPanel-Xlza8Stt.js} +1 -1
- package/dist/rcs-web/assets/Claim-BMWwu213.js +1 -0
- package/{packages/remote-control-server/web/dist/assets/Dashboard-BZGcSCFY.js → dist/rcs-web/assets/Dashboard-D5awDzM3.js} +2 -2
- package/{packages/remote-control-server/web/dist/assets/Join-B_e3BKa3.js → dist/rcs-web/assets/Join-ok37ggfZ.js} +1 -1
- package/dist/rcs-web/assets/{Login-u6CGGkoD.js → Login-5qo97rq-.js} +1 -1
- package/dist/rcs-web/assets/{Register-C4Fk0ibc.js → Register-D_UOG8ar.js} +1 -1
- package/dist/rcs-web/assets/SessionDetail-BbHrR4Qu.js +65 -0
- package/dist/rcs-web/assets/{SessionVisibilityBadge-BHKxlh8U.js → SessionVisibilityBadge-Dy4FwTzo.js} +1 -1
- package/dist/rcs-web/assets/{Setup-DReCE0zx.js → Setup-GnPeNyH9.js} +1 -1
- package/dist/rcs-web/assets/{ShareLanding-qE1U0WKZ.js → ShareLanding-CUjQydLL.js} +1 -1
- package/dist/rcs-web/assets/{TeamCreate-BgwgZP4a.js → TeamCreate-Ck2fEoUW.js} +1 -1
- package/dist/rcs-web/assets/{TeamDetail-BHCvnI2t.js → TeamDetail-De6EPND0.js} +2 -2
- package/dist/rcs-web/assets/{TeamList-B7uC8lDV.js → TeamList-C-0LJRxd.js} +1 -1
- package/dist/rcs-web/assets/{TeamSettings-DtgvrKEE.js → TeamSettings-BszOrXVW.js} +1 -1
- package/dist/rcs-web/assets/{UserSearchInput-dgxhGWfJ.js → UserSearchInput-CyQWtLL-.js} +1 -1
- package/dist/rcs-web/assets/{UserSettings-Zyjam23-.js → UserSettings-DgyYp-1y.js} +1 -1
- package/dist/rcs-web/assets/{arc-DgC_wPAg.js → arc-BaOPt7k-.js} +1 -1
- package/dist/rcs-web/assets/{architectureDiagram-3BPJPVTR-BnnCRJZs.js → architectureDiagram-3BPJPVTR-SvIakXbT.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/blockDiagram-GPEHLZMM-CvpYdvcP.js → dist/rcs-web/assets/blockDiagram-GPEHLZMM-CiDp9J7i.js} +1 -1
- package/dist/rcs-web/assets/{c4Diagram-AAUBKEIU-DNK__-3d.js → c4Diagram-AAUBKEIU-D9wzA9ur.js} +1 -1
- package/dist/rcs-web/assets/channel-CirgRB_G.js +1 -0
- package/dist/rcs-web/assets/{chunk-2J33WTMH-5JQBz2na.js → chunk-2J33WTMH-qfYueRAP.js} +1 -1
- package/dist/rcs-web/assets/{chunk-4BX2VUAB-YJh8d73x.js → chunk-4BX2VUAB-D1V_UCiK.js} +1 -1
- package/dist/rcs-web/assets/{chunk-55IACEB6-U5c5GQZN.js → chunk-55IACEB6-C67QiGmo.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/chunk-727SXJPM-ifGCid_3.js → dist/rcs-web/assets/chunk-727SXJPM-D2Wln4TT.js} +1 -1
- package/dist/rcs-web/assets/{chunk-AQP2D5EJ-DxqPH2_Q.js → chunk-AQP2D5EJ-03h8hZhw.js} +1 -1
- package/dist/rcs-web/assets/{chunk-FMBD7UC4-dDtjQRPo.js → chunk-FMBD7UC4-7zas8pDp.js} +1 -1
- package/dist/rcs-web/assets/{chunk-ND2GUHAM-0UF6vhhE.js → chunk-ND2GUHAM-PUXucyY6.js} +1 -1
- package/dist/rcs-web/assets/{chunk-QZHKN3VN-CfZ4xcBz.js → chunk-QZHKN3VN-M3U5l4yW.js} +1 -1
- package/dist/rcs-web/assets/classDiagram-4FO5ZUOK-Cq12UEz9.js +1 -0
- package/dist/rcs-web/assets/classDiagram-v2-Q7XG4LA2-Cq12UEz9.js +1 -0
- package/dist/rcs-web/assets/{code-block-IT6T5CEO-B4B0UrXo.js → code-block-IT6T5CEO-BgUazuuS.js} +1 -1
- package/dist/rcs-web/assets/{copy-_OW0eGyp.js → copy-DjaSB1Rw.js} +1 -1
- package/dist/rcs-web/assets/{cose-bilkent-S5V4N54A-B19xQvnh.js → cose-bilkent-S5V4N54A-zPupX74N.js} +1 -1
- package/dist/rcs-web/assets/{dagre-BM42HDAG-5JJnjI1B.js → dagre-BM42HDAG-B_EJ050J.js} +1 -1
- package/dist/rcs-web/assets/{diagram-2AECGRRQ-BY2NR7vr.js → diagram-2AECGRRQ-dnnxPH7w.js} +1 -1
- package/dist/rcs-web/assets/{diagram-5GNKFQAL-3zC3GraP.js → diagram-5GNKFQAL-CLEOqCLZ.js} +1 -1
- package/dist/rcs-web/assets/{diagram-KO2AKTUF-T1Jt5zH3.js → diagram-KO2AKTUF-DKBGpiRW.js} +1 -1
- package/dist/rcs-web/assets/{diagram-LMA3HP47-ehrkQG1e.js → diagram-LMA3HP47-BAilhXiA.js} +1 -1
- package/dist/rcs-web/assets/{diagram-OG6HWLK6-D8ZJlGs0.js → diagram-OG6HWLK6-C3CdmOxC.js} +1 -1
- package/dist/rcs-web/assets/{erDiagram-TEJ5UH35-Ckn1pY7G.js → erDiagram-TEJ5UH35-D1yv-3Jv.js} +1 -1
- package/dist/rcs-web/assets/{flowDiagram-I6XJVG4X-C1xnAOfH.js → flowDiagram-I6XJVG4X-DpW11XWj.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/ganttDiagram-6RSMTGT7-Dw8qOfCT.js → dist/rcs-web/assets/ganttDiagram-6RSMTGT7-CWr8suZm.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/gitGraphDiagram-PVQCEYII-Cg3La45a.js → dist/rcs-web/assets/gitGraphDiagram-PVQCEYII-BspxLSNV.js} +1 -1
- package/dist/rcs-web/assets/{infoDiagram-5YYISTIA-CGH2aXpd.js → infoDiagram-5YYISTIA-Bow20s-Q.js} +1 -1
- package/dist/rcs-web/assets/{ishikawaDiagram-YF4QCWOH-x89F9Igr.js → ishikawaDiagram-YF4QCWOH-BESvGYGI.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/journeyDiagram-JHISSGLW-Ckd_pKi0.js → dist/rcs-web/assets/journeyDiagram-JHISSGLW-DZ6gzC7H.js} +1 -1
- package/dist/rcs-web/assets/{kanban-definition-UN3LZRKU-D2dEXdru.js → kanban-definition-UN3LZRKU-DIQo2GiM.js} +1 -1
- package/dist/rcs-web/assets/{linear-CexxJrg8.js → linear-CdXALiZ8.js} +1 -1
- package/dist/rcs-web/assets/{main-L9iyf39T.js → main-CwLwGVDc.js} +7 -7
- package/dist/rcs-web/assets/{mermaid-VLURNSYL-BomP37Br.js → mermaid-VLURNSYL-C0ZKM74W.js} +4 -4
- package/dist/rcs-web/assets/{mermaid.core-BxkfDFm_.js → mermaid.core-eEtoQhrQ.js} +5 -5
- package/dist/rcs-web/assets/{mindmap-definition-RKZ34NQL-HVsZx8Je.js → mindmap-definition-RKZ34NQL-CcW3H_cH.js} +1 -1
- package/dist/rcs-web/assets/{pieDiagram-4H26LBE5-D0U9q74D.js → pieDiagram-4H26LBE5-DpXUpJMl.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/quadrantDiagram-W4KKPZXB-CWPBZMPj.js → dist/rcs-web/assets/quadrantDiagram-W4KKPZXB-DOwMRzzP.js} +1 -1
- package/dist/rcs-web/assets/{requirementDiagram-4Y6WPE33-CiQbIN_P.js → requirementDiagram-4Y6WPE33-CBi_6NcW.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/sankeyDiagram-5OEKKPKP-Bw66fXM0.js → dist/rcs-web/assets/sankeyDiagram-5OEKKPKP-CKbAoTHm.js} +1 -1
- package/dist/rcs-web/assets/{sequenceDiagram-3UESZ5HK-lv5WhGb6.js → sequenceDiagram-3UESZ5HK-a3rYCe-w.js} +1 -1
- package/dist/rcs-web/assets/{stateDiagram-AJRCARHV-BLRRpX3g.js → stateDiagram-AJRCARHV-B6R_Dt84.js} +1 -1
- package/dist/rcs-web/assets/{stateDiagram-v2-BHNVJYJU-B-5gzDu6.js → stateDiagram-v2-BHNVJYJU-Cq935fvz.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/timeline-definition-PNZ67QCA-DO8oVMVA.js → dist/rcs-web/assets/timeline-definition-PNZ67QCA-8DXPKq1k.js} +1 -1
- package/dist/rcs-web/assets/{vennDiagram-CIIHVFJN-D2RbeAHj.js → vennDiagram-CIIHVFJN-BfDEkku5.js} +1 -1
- package/dist/rcs-web/assets/{wardleyDiagram-YWT4CUSO-D8D1cIXp.js → wardleyDiagram-YWT4CUSO-Dvp2XZVf.js} +1 -1
- package/{packages/remote-control-server/web/dist/assets/xychartDiagram-2RQKCTM6-Bzk5AxMb.js → dist/rcs-web/assets/xychartDiagram-2RQKCTM6-DiPjQLUx.js} +1 -1
- package/dist/rcs-web/index.html +1 -1
- package/package.json +1 -1
- package/packages/remote-control-server/src/__tests__/event-bus.test.ts +50 -0
- package/packages/remote-control-server/src/__tests__/routes.test.ts +115 -5
- package/packages/remote-control-server/src/__tests__/turn-end-status.test.ts +205 -0
- package/packages/remote-control-server/src/routes/v2/worker-events.ts +22 -0
- package/packages/remote-control-server/src/routes/web/sessions.ts +64 -1
- package/packages/remote-control-server/src/transport/event-bus.ts +9 -0
- package/packages/remote-control-server/web/dist/assets/{AdminPanel-CbcZ7Vnr.js → AdminPanel-Xlza8Stt.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/Claim-BMWwu213.js +1 -0
- package/{dist/rcs-web/assets/Dashboard-BZGcSCFY.js → packages/remote-control-server/web/dist/assets/Dashboard-D5awDzM3.js} +2 -2
- package/{dist/rcs-web/assets/Join-B_e3BKa3.js → packages/remote-control-server/web/dist/assets/Join-ok37ggfZ.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{Login-u6CGGkoD.js → Login-5qo97rq-.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{Register-C4Fk0ibc.js → Register-D_UOG8ar.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/SessionDetail-BbHrR4Qu.js +65 -0
- package/packages/remote-control-server/web/dist/assets/{SessionVisibilityBadge-BHKxlh8U.js → SessionVisibilityBadge-Dy4FwTzo.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{Setup-DReCE0zx.js → Setup-GnPeNyH9.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{ShareLanding-qE1U0WKZ.js → ShareLanding-CUjQydLL.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{TeamCreate-BgwgZP4a.js → TeamCreate-Ck2fEoUW.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{TeamDetail-BHCvnI2t.js → TeamDetail-De6EPND0.js} +2 -2
- package/packages/remote-control-server/web/dist/assets/{TeamList-B7uC8lDV.js → TeamList-C-0LJRxd.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{TeamSettings-DtgvrKEE.js → TeamSettings-BszOrXVW.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{UserSearchInput-dgxhGWfJ.js → UserSearchInput-CyQWtLL-.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{UserSettings-Zyjam23-.js → UserSettings-DgyYp-1y.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{arc-DgC_wPAg.js → arc-BaOPt7k-.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{architectureDiagram-3BPJPVTR-BnnCRJZs.js → architectureDiagram-3BPJPVTR-SvIakXbT.js} +1 -1
- package/{dist/rcs-web/assets/blockDiagram-GPEHLZMM-CvpYdvcP.js → packages/remote-control-server/web/dist/assets/blockDiagram-GPEHLZMM-CiDp9J7i.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{c4Diagram-AAUBKEIU-DNK__-3d.js → c4Diagram-AAUBKEIU-D9wzA9ur.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/channel-CirgRB_G.js +1 -0
- package/packages/remote-control-server/web/dist/assets/{chunk-2J33WTMH-5JQBz2na.js → chunk-2J33WTMH-qfYueRAP.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{chunk-4BX2VUAB-YJh8d73x.js → chunk-4BX2VUAB-D1V_UCiK.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{chunk-55IACEB6-U5c5GQZN.js → chunk-55IACEB6-C67QiGmo.js} +1 -1
- package/{dist/rcs-web/assets/chunk-727SXJPM-ifGCid_3.js → packages/remote-control-server/web/dist/assets/chunk-727SXJPM-D2Wln4TT.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{chunk-AQP2D5EJ-DxqPH2_Q.js → chunk-AQP2D5EJ-03h8hZhw.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{chunk-FMBD7UC4-dDtjQRPo.js → chunk-FMBD7UC4-7zas8pDp.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{chunk-ND2GUHAM-0UF6vhhE.js → chunk-ND2GUHAM-PUXucyY6.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{chunk-QZHKN3VN-CfZ4xcBz.js → chunk-QZHKN3VN-M3U5l4yW.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/classDiagram-4FO5ZUOK-Cq12UEz9.js +1 -0
- package/packages/remote-control-server/web/dist/assets/classDiagram-v2-Q7XG4LA2-Cq12UEz9.js +1 -0
- package/packages/remote-control-server/web/dist/assets/{code-block-IT6T5CEO-B4B0UrXo.js → code-block-IT6T5CEO-BgUazuuS.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{copy-_OW0eGyp.js → copy-DjaSB1Rw.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{cose-bilkent-S5V4N54A-B19xQvnh.js → cose-bilkent-S5V4N54A-zPupX74N.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{dagre-BM42HDAG-5JJnjI1B.js → dagre-BM42HDAG-B_EJ050J.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{diagram-2AECGRRQ-BY2NR7vr.js → diagram-2AECGRRQ-dnnxPH7w.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{diagram-5GNKFQAL-3zC3GraP.js → diagram-5GNKFQAL-CLEOqCLZ.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{diagram-KO2AKTUF-T1Jt5zH3.js → diagram-KO2AKTUF-DKBGpiRW.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{diagram-LMA3HP47-ehrkQG1e.js → diagram-LMA3HP47-BAilhXiA.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{diagram-OG6HWLK6-D8ZJlGs0.js → diagram-OG6HWLK6-C3CdmOxC.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{erDiagram-TEJ5UH35-Ckn1pY7G.js → erDiagram-TEJ5UH35-D1yv-3Jv.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{flowDiagram-I6XJVG4X-C1xnAOfH.js → flowDiagram-I6XJVG4X-DpW11XWj.js} +1 -1
- package/{dist/rcs-web/assets/ganttDiagram-6RSMTGT7-Dw8qOfCT.js → packages/remote-control-server/web/dist/assets/ganttDiagram-6RSMTGT7-CWr8suZm.js} +1 -1
- package/{dist/rcs-web/assets/gitGraphDiagram-PVQCEYII-Cg3La45a.js → packages/remote-control-server/web/dist/assets/gitGraphDiagram-PVQCEYII-BspxLSNV.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{infoDiagram-5YYISTIA-CGH2aXpd.js → infoDiagram-5YYISTIA-Bow20s-Q.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{ishikawaDiagram-YF4QCWOH-x89F9Igr.js → ishikawaDiagram-YF4QCWOH-BESvGYGI.js} +1 -1
- package/{dist/rcs-web/assets/journeyDiagram-JHISSGLW-Ckd_pKi0.js → packages/remote-control-server/web/dist/assets/journeyDiagram-JHISSGLW-DZ6gzC7H.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{kanban-definition-UN3LZRKU-D2dEXdru.js → kanban-definition-UN3LZRKU-DIQo2GiM.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{linear-CexxJrg8.js → linear-CdXALiZ8.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{main-L9iyf39T.js → main-CwLwGVDc.js} +7 -7
- package/packages/remote-control-server/web/dist/assets/{mermaid-VLURNSYL-BomP37Br.js → mermaid-VLURNSYL-C0ZKM74W.js} +4 -4
- package/packages/remote-control-server/web/dist/assets/{mermaid.core-BxkfDFm_.js → mermaid.core-eEtoQhrQ.js} +5 -5
- package/packages/remote-control-server/web/dist/assets/{mindmap-definition-RKZ34NQL-HVsZx8Je.js → mindmap-definition-RKZ34NQL-CcW3H_cH.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{pieDiagram-4H26LBE5-D0U9q74D.js → pieDiagram-4H26LBE5-DpXUpJMl.js} +1 -1
- package/{dist/rcs-web/assets/quadrantDiagram-W4KKPZXB-CWPBZMPj.js → packages/remote-control-server/web/dist/assets/quadrantDiagram-W4KKPZXB-DOwMRzzP.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{requirementDiagram-4Y6WPE33-CiQbIN_P.js → requirementDiagram-4Y6WPE33-CBi_6NcW.js} +1 -1
- package/{dist/rcs-web/assets/sankeyDiagram-5OEKKPKP-Bw66fXM0.js → packages/remote-control-server/web/dist/assets/sankeyDiagram-5OEKKPKP-CKbAoTHm.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{sequenceDiagram-3UESZ5HK-lv5WhGb6.js → sequenceDiagram-3UESZ5HK-a3rYCe-w.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{stateDiagram-AJRCARHV-BLRRpX3g.js → stateDiagram-AJRCARHV-B6R_Dt84.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{stateDiagram-v2-BHNVJYJU-B-5gzDu6.js → stateDiagram-v2-BHNVJYJU-Cq935fvz.js} +1 -1
- package/{dist/rcs-web/assets/timeline-definition-PNZ67QCA-DO8oVMVA.js → packages/remote-control-server/web/dist/assets/timeline-definition-PNZ67QCA-8DXPKq1k.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{vennDiagram-CIIHVFJN-D2RbeAHj.js → vennDiagram-CIIHVFJN-BfDEkku5.js} +1 -1
- package/packages/remote-control-server/web/dist/assets/{wardleyDiagram-YWT4CUSO-D8D1cIXp.js → wardleyDiagram-YWT4CUSO-Dvp2XZVf.js} +1 -1
- package/{dist/rcs-web/assets/xychartDiagram-2RQKCTM6-Bzk5AxMb.js → packages/remote-control-server/web/dist/assets/xychartDiagram-2RQKCTM6-DiPjQLUx.js} +1 -1
- package/packages/remote-control-server/web/dist/index.html +1 -1
- package/dist/rcs-web/assets/Claim-CN3D3Ku6.js +0 -1
- package/dist/rcs-web/assets/SessionDetail-Bd1YgozL.js +0 -65
- package/dist/rcs-web/assets/channel-DB6b62-p.js +0 -1
- package/dist/rcs-web/assets/classDiagram-4FO5ZUOK-DkXLqlKv.js +0 -1
- package/dist/rcs-web/assets/classDiagram-v2-Q7XG4LA2-DkXLqlKv.js +0 -1
- package/packages/remote-control-server/web/dist/assets/Claim-CN3D3Ku6.js +0 -1
- package/packages/remote-control-server/web/dist/assets/SessionDetail-Bd1YgozL.js +0 -65
- package/packages/remote-control-server/web/dist/assets/channel-DB6b62-p.js +0 -1
- package/packages/remote-control-server/web/dist/assets/classDiagram-4FO5ZUOK-DkXLqlKv.js +0 -1
- package/packages/remote-control-server/web/dist/assets/classDiagram-v2-Q7XG4LA2-DkXLqlKv.js +0 -1
|
@@ -15,6 +15,11 @@
|
|
|
15
15
|
--text: #e7e3f4;
|
|
16
16
|
--text-dim: #9b94b8;
|
|
17
17
|
--text-faint: #5c5575;
|
|
18
|
+
/* --ui-scale is set by cube.js: multiplier on design px. All visual
|
|
19
|
+
dimensions below use calc(Npx * var(--ui-scale)) so the UI grows with
|
|
20
|
+
the window. Functional elements (resize handles, ctx menu, close btn,
|
|
21
|
+
ws status) stay fixed for usability. */
|
|
22
|
+
--ui-scale: 1;
|
|
18
23
|
}
|
|
19
24
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
20
25
|
html, body {
|
|
@@ -33,12 +38,17 @@
|
|
|
33
38
|
}
|
|
34
39
|
|
|
35
40
|
/* ---- Left: cube stage ----
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
41
|
+
flex-basis is a percentage so the stage scales with the window. The cube
|
|
42
|
+
is a CSS 3D transform element — three faces (body + ::before + ::after)
|
|
43
|
+
form a visible cube. Rotates when .rotating is applied (driven by
|
|
44
|
+
runningCount + cubeMode in cube.js).
|
|
45
|
+
|
|
46
|
+
preserve-3d constraint: .cube has transform-style: preserve-3d, so NEVER
|
|
47
|
+
apply filter/opacity (<1) to .cube itself — grouping properties flatten
|
|
48
|
+
3D subtrees. All glow/dim effects live on #cube-stage (whose own subtree
|
|
49
|
+
composites before being filtered) or animate leaf colors only. */
|
|
40
50
|
#cube-stage {
|
|
41
|
-
flex: 0 0 43%;
|
|
51
|
+
flex: 0 0 43%;
|
|
42
52
|
height: 100%;
|
|
43
53
|
position: relative;
|
|
44
54
|
background:
|
|
@@ -48,13 +58,44 @@
|
|
|
48
58
|
align-items: center;
|
|
49
59
|
justify-content: center;
|
|
50
60
|
border-right: 1px solid var(--border);
|
|
51
|
-
perspective: 200px;
|
|
61
|
+
perspective: calc(200px * var(--ui-scale));
|
|
62
|
+
/* Idle: slightly dim, transitions back smoothly when rotation stops. */
|
|
63
|
+
filter: brightness(0.96);
|
|
64
|
+
transition: filter 0.35s ease;
|
|
65
|
+
}
|
|
66
|
+
/* Rotating: glow pulse on the STAGE (grouping here is safe — the cube's
|
|
67
|
+
internal 3D composition finishes before the stage-level filter applies). */
|
|
68
|
+
#cube-stage.rotating {
|
|
69
|
+
animation: stage-glow 1.4s ease-in-out infinite alternate;
|
|
70
|
+
}
|
|
71
|
+
@keyframes stage-glow {
|
|
72
|
+
from { filter: brightness(1) drop-shadow(0 0 0 rgba(139, 92, 246, 0)); }
|
|
73
|
+
to { filter: brightness(1.15) drop-shadow(0 0 calc(12px * var(--ui-scale)) var(--purple-glow)); }
|
|
74
|
+
}
|
|
75
|
+
/* Halo behind the cube — pulses while rotating. */
|
|
76
|
+
#cube-stage::before {
|
|
77
|
+
content: '';
|
|
78
|
+
position: absolute;
|
|
79
|
+
width: calc(90px * var(--ui-scale));
|
|
80
|
+
height: calc(90px * var(--ui-scale));
|
|
81
|
+
border-radius: 50%;
|
|
82
|
+
background: radial-gradient(circle, var(--purple-glow) 0%, transparent 65%);
|
|
83
|
+
opacity: 0;
|
|
84
|
+
transition: opacity 0.4s ease;
|
|
85
|
+
pointer-events: none;
|
|
86
|
+
}
|
|
87
|
+
#cube-stage.rotating::before {
|
|
88
|
+
animation: halo-pulse 1.4s ease-in-out infinite alternate;
|
|
89
|
+
}
|
|
90
|
+
@keyframes halo-pulse {
|
|
91
|
+
from { opacity: 0.3; }
|
|
92
|
+
to { opacity: 0.85; }
|
|
52
93
|
}
|
|
53
94
|
/* CSS 3D cube: body is the front face, ::before is the right face,
|
|
54
95
|
::after is the top face. Half-size translates position them at 90°. */
|
|
55
96
|
.cube {
|
|
56
|
-
width: 22px;
|
|
57
|
-
height: 22px;
|
|
97
|
+
width: calc(22px * var(--ui-scale));
|
|
98
|
+
height: calc(22px * var(--ui-scale));
|
|
58
99
|
position: relative;
|
|
59
100
|
transform-style: preserve-3d;
|
|
60
101
|
transform: rotateX(-28deg) rotateY(45deg);
|
|
@@ -62,7 +103,7 @@
|
|
|
62
103
|
border: 1px solid #8B5CF6;
|
|
63
104
|
}
|
|
64
105
|
.cube.rotating {
|
|
65
|
-
animation: cube-spin 8s linear infinite;
|
|
106
|
+
animation: cube-spin 2.8s linear infinite;
|
|
66
107
|
}
|
|
67
108
|
.cube::before,
|
|
68
109
|
.cube::after {
|
|
@@ -71,12 +112,12 @@
|
|
|
71
112
|
inset: 0;
|
|
72
113
|
}
|
|
73
114
|
.cube::before {
|
|
74
|
-
transform: rotateY(90deg) translateZ(11px);
|
|
115
|
+
transform: rotateY(90deg) translateZ(calc(11px * var(--ui-scale)));
|
|
75
116
|
background: rgba(167, 139, 250, 0.55);
|
|
76
117
|
border: 1px solid #a78bfa;
|
|
77
118
|
}
|
|
78
119
|
.cube::after {
|
|
79
|
-
transform: rotateX(90deg) translateZ(11px);
|
|
120
|
+
transform: rotateX(90deg) translateZ(calc(11px * var(--ui-scale)));
|
|
80
121
|
background: rgba(109, 40, 217, 0.4);
|
|
81
122
|
border: 1px solid #6d28d9;
|
|
82
123
|
}
|
|
@@ -86,14 +127,16 @@
|
|
|
86
127
|
}
|
|
87
128
|
@media (prefers-reduced-motion: reduce) {
|
|
88
129
|
.cube.rotating { animation: none; }
|
|
130
|
+
#cube-stage.rotating { animation: none; }
|
|
131
|
+
#cube-stage.rotating::before { animation: none; opacity: 0.5; }
|
|
89
132
|
}
|
|
90
133
|
/* Subtle ring frame around the cube */
|
|
91
134
|
#cube-stage::after {
|
|
92
135
|
content: '';
|
|
93
136
|
position: absolute;
|
|
94
|
-
inset: 14px;
|
|
137
|
+
inset: calc(14px * var(--ui-scale));
|
|
95
138
|
border: 1px solid rgba(139, 92, 246, 0.12);
|
|
96
|
-
border-radius: 8px;
|
|
139
|
+
border-radius: calc(8px * var(--ui-scale));
|
|
97
140
|
pointer-events: none;
|
|
98
141
|
}
|
|
99
142
|
|
|
@@ -101,10 +144,10 @@
|
|
|
101
144
|
#panel {
|
|
102
145
|
flex: 1;
|
|
103
146
|
height: 100%;
|
|
104
|
-
padding: 12px 14px 10px;
|
|
147
|
+
padding: calc(12px * var(--ui-scale)) calc(14px * var(--ui-scale)) calc(10px * var(--ui-scale));
|
|
105
148
|
display: flex;
|
|
106
149
|
flex-direction: column;
|
|
107
|
-
gap: 8px;
|
|
150
|
+
gap: calc(8px * var(--ui-scale));
|
|
108
151
|
background: linear-gradient(180deg, var(--bg-elev) 0%, var(--bg) 100%);
|
|
109
152
|
position: relative;
|
|
110
153
|
}
|
|
@@ -113,11 +156,11 @@
|
|
|
113
156
|
#counts-row {
|
|
114
157
|
display: flex;
|
|
115
158
|
align-items: baseline;
|
|
116
|
-
gap: 8px;
|
|
159
|
+
gap: calc(8px * var(--ui-scale));
|
|
117
160
|
flex-shrink: 0;
|
|
118
161
|
}
|
|
119
162
|
#running-count {
|
|
120
|
-
font-size: 28px;
|
|
163
|
+
font-size: calc(28px * var(--ui-scale));
|
|
121
164
|
font-weight: 700;
|
|
122
165
|
line-height: 1;
|
|
123
166
|
color: var(--purple-soft);
|
|
@@ -125,25 +168,25 @@
|
|
|
125
168
|
font-variant-numeric: tabular-nums;
|
|
126
169
|
}
|
|
127
170
|
#counts-sep {
|
|
128
|
-
font-size: 14px;
|
|
171
|
+
font-size: calc(14px * var(--ui-scale));
|
|
129
172
|
color: var(--text-faint);
|
|
130
173
|
font-weight: 300;
|
|
131
174
|
}
|
|
132
175
|
#waiting-pill {
|
|
133
176
|
display: inline-flex;
|
|
134
177
|
align-items: center;
|
|
135
|
-
gap: 4px;
|
|
136
|
-
padding: 2px 7px;
|
|
137
|
-
border-radius: 9px;
|
|
178
|
+
gap: calc(4px * var(--ui-scale));
|
|
179
|
+
padding: calc(2px * var(--ui-scale)) calc(7px * var(--ui-scale));
|
|
180
|
+
border-radius: calc(9px * var(--ui-scale));
|
|
138
181
|
background: rgba(251, 191, 36, 0.12);
|
|
139
182
|
color: var(--amber);
|
|
140
|
-
font-size: 11px;
|
|
183
|
+
font-size: calc(11px * var(--ui-scale));
|
|
141
184
|
font-weight: 600;
|
|
142
185
|
line-height: 1.3;
|
|
143
186
|
font-variant-numeric: tabular-nums;
|
|
144
187
|
}
|
|
145
188
|
#waiting-pill .dot {
|
|
146
|
-
width: 5px; height: 5px;
|
|
189
|
+
width: calc(5px * var(--ui-scale)); height: calc(5px * var(--ui-scale));
|
|
147
190
|
border-radius: 50%;
|
|
148
191
|
background: var(--amber);
|
|
149
192
|
box-shadow: 0 0 4px var(--amber);
|
|
@@ -156,23 +199,23 @@
|
|
|
156
199
|
overflow: hidden;
|
|
157
200
|
display: flex;
|
|
158
201
|
flex-direction: column;
|
|
159
|
-
gap: 3px;
|
|
202
|
+
gap: calc(3px * var(--ui-scale));
|
|
160
203
|
min-height: 0;
|
|
161
204
|
position: relative;
|
|
162
205
|
}
|
|
163
206
|
#sessions-inner {
|
|
164
207
|
display: flex;
|
|
165
208
|
flex-direction: column;
|
|
166
|
-
gap: 3px;
|
|
209
|
+
gap: calc(3px * var(--ui-scale));
|
|
167
210
|
min-height: 0;
|
|
168
211
|
will-change: transform;
|
|
169
212
|
}
|
|
170
213
|
/* Custom scrollbar: invisible by default, fades in on hover/scroll */
|
|
171
214
|
#scrollbar-track {
|
|
172
215
|
position: absolute;
|
|
173
|
-
right: 12px;
|
|
174
|
-
width: 4px;
|
|
175
|
-
border-radius: 2px;
|
|
216
|
+
right: calc(12px * var(--ui-scale));
|
|
217
|
+
width: calc(4px * var(--ui-scale));
|
|
218
|
+
border-radius: calc(2px * var(--ui-scale));
|
|
176
219
|
z-index: 50;
|
|
177
220
|
opacity: 0;
|
|
178
221
|
transition: opacity 0.3s ease;
|
|
@@ -185,8 +228,8 @@
|
|
|
185
228
|
#scrollbar-thumb {
|
|
186
229
|
position: absolute;
|
|
187
230
|
width: 100%;
|
|
188
|
-
min-height: 16px;
|
|
189
|
-
border-radius: 2px;
|
|
231
|
+
min-height: calc(16px * var(--ui-scale));
|
|
232
|
+
border-radius: calc(2px * var(--ui-scale));
|
|
190
233
|
background: rgba(139, 92, 246, 0.35);
|
|
191
234
|
transition: background 0.15s ease;
|
|
192
235
|
}
|
|
@@ -195,10 +238,10 @@
|
|
|
195
238
|
background: rgba(139, 92, 246, 0.6);
|
|
196
239
|
}
|
|
197
240
|
.session-row {
|
|
198
|
-
font-size: 10.5px;
|
|
241
|
+
font-size: calc(10.5px * var(--ui-scale));
|
|
199
242
|
line-height: 1.35;
|
|
200
243
|
color: var(--text-dim);
|
|
201
|
-
padding: 2px 0 2px 14px;
|
|
244
|
+
padding: calc(2px * var(--ui-scale)) 0 calc(2px * var(--ui-scale)) calc(14px * var(--ui-scale));
|
|
202
245
|
position: relative;
|
|
203
246
|
font-variant-numeric: tabular-nums;
|
|
204
247
|
display: flex;
|
|
@@ -215,7 +258,7 @@
|
|
|
215
258
|
position: absolute;
|
|
216
259
|
left: 0; top: 50%;
|
|
217
260
|
transform: translateY(-50%);
|
|
218
|
-
width: 12px; height: 12px;
|
|
261
|
+
width: calc(12px * var(--ui-scale)); height: calc(12px * var(--ui-scale));
|
|
219
262
|
cursor: pointer;
|
|
220
263
|
display: flex;
|
|
221
264
|
align-items: center;
|
|
@@ -226,15 +269,15 @@
|
|
|
226
269
|
}
|
|
227
270
|
.session-jump::before {
|
|
228
271
|
content: '';
|
|
229
|
-
width: 4px; height: 4px;
|
|
272
|
+
width: calc(4px * var(--ui-scale)); height: calc(4px * var(--ui-scale));
|
|
230
273
|
border-radius: 50%;
|
|
231
274
|
background: var(--purple);
|
|
232
275
|
transition: all 0.15s ease;
|
|
233
276
|
}
|
|
234
277
|
.session-jump:hover {
|
|
235
278
|
color: var(--purple-soft);
|
|
236
|
-
font-size: 12px;
|
|
237
|
-
left: -3px;
|
|
279
|
+
font-size: calc(12px * var(--ui-scale));
|
|
280
|
+
left: calc(-3px * var(--ui-scale));
|
|
238
281
|
}
|
|
239
282
|
.session-jump:hover::before {
|
|
240
283
|
content: '\25B8';
|
|
@@ -252,12 +295,39 @@
|
|
|
252
295
|
.session-row.blocked { color: #c9a96a; }
|
|
253
296
|
.session-row.idle { color: var(--text-faint); font-style: italic; }
|
|
254
297
|
.session-empty {
|
|
255
|
-
font-size: 10px;
|
|
298
|
+
font-size: calc(10px * var(--ui-scale));
|
|
256
299
|
color: var(--text-faint);
|
|
257
300
|
font-style: italic;
|
|
258
|
-
padding-left: 14px;
|
|
301
|
+
padding-left: calc(14px * var(--ui-scale));
|
|
259
302
|
}
|
|
260
303
|
|
|
304
|
+
/* ---- Detail mode session rows: state badge + 2-line prompt + full-row hit ---- */
|
|
305
|
+
.session-badge { display: none; }
|
|
306
|
+
body[data-mode='detail'] .session-badge {
|
|
307
|
+
display: inline-block;
|
|
308
|
+
flex-shrink: 0;
|
|
309
|
+
font-size: calc(8px * var(--ui-scale));
|
|
310
|
+
font-weight: 700;
|
|
311
|
+
letter-spacing: 0.5px;
|
|
312
|
+
line-height: 1;
|
|
313
|
+
padding: calc(2px * var(--ui-scale)) calc(4px * var(--ui-scale));
|
|
314
|
+
border-radius: calc(3px * var(--ui-scale));
|
|
315
|
+
margin-right: calc(6px * var(--ui-scale));
|
|
316
|
+
font-style: normal;
|
|
317
|
+
}
|
|
318
|
+
.session-badge.run { background: rgba(139, 92, 246, 0.18); color: var(--purple-soft); }
|
|
319
|
+
.session-badge.block { background: rgba(251, 191, 36, 0.15); color: var(--amber); }
|
|
320
|
+
.session-badge.idle { background: rgba(155, 148, 184, 0.12); color: var(--text-faint); }
|
|
321
|
+
body[data-mode='detail'] .session-text {
|
|
322
|
+
white-space: normal;
|
|
323
|
+
display: -webkit-box;
|
|
324
|
+
-webkit-box-orient: vertical;
|
|
325
|
+
-webkit-line-clamp: 2;
|
|
326
|
+
}
|
|
327
|
+
body[data-mode='detail'] .session-row { cursor: pointer; }
|
|
328
|
+
body[data-mode='detail'] .session-row:hover { color: var(--text); }
|
|
329
|
+
body[data-mode='detail'] #cube-stage { flex: 0 0 36%; }
|
|
330
|
+
|
|
261
331
|
/* Jump feedback: ripple wave sweeping from left to right across the row */
|
|
262
332
|
.session-row.jumping {
|
|
263
333
|
position: relative;
|
|
@@ -284,13 +354,30 @@
|
|
|
284
354
|
}
|
|
285
355
|
|
|
286
356
|
#more-line {
|
|
287
|
-
font-size: 9px;
|
|
357
|
+
font-size: calc(9px * var(--ui-scale));
|
|
288
358
|
color: var(--text-faint);
|
|
289
359
|
flex-shrink: 0;
|
|
290
360
|
text-align: right;
|
|
291
361
|
padding-top: 1px;
|
|
292
362
|
}
|
|
293
363
|
|
|
364
|
+
/* ---- Display modes ----
|
|
365
|
+
logo: cube only. mini: cube + counts. standard: default (all).
|
|
366
|
+
detail: large detail layout (badge/2-line/row-click rules above). */
|
|
367
|
+
body[data-mode='logo'] #panel { display: none; }
|
|
368
|
+
body[data-mode='logo'] #cube-stage { flex: 1 1 100%; border-right: none; }
|
|
369
|
+
body[data-mode='mini'] #sessions,
|
|
370
|
+
body[data-mode='mini'] #more-line,
|
|
371
|
+
body[data-mode='mini'] #scrollbar-track { display: none; }
|
|
372
|
+
body[data-mode='mini'] #panel { justify-content: center; }
|
|
373
|
+
|
|
374
|
+
/* Mode-switch fade (replayed by re-adding body.mode-swap in cube.js) */
|
|
375
|
+
body.mode-swap #panel { animation: mode-fade 0.25s ease; }
|
|
376
|
+
body.mode-swap #cube-stage { animation: mode-fade 0.25s ease; }
|
|
377
|
+
@keyframes mode-fade {
|
|
378
|
+
from { opacity: 0; }
|
|
379
|
+
}
|
|
380
|
+
|
|
294
381
|
/* WS status indicator — small dot in bottom-right corner */
|
|
295
382
|
#ws-status {
|
|
296
383
|
position: fixed;
|
|
@@ -342,8 +429,21 @@
|
|
|
342
429
|
border-radius: 6px;
|
|
343
430
|
z-index: 9999;
|
|
344
431
|
padding: 3px;
|
|
345
|
-
min-width:
|
|
432
|
+
min-width: 132px;
|
|
346
433
|
box-shadow: 0 4px 16px rgba(0,0,0,0.5);
|
|
434
|
+
transform-origin: top left;
|
|
435
|
+
animation: menu-in 0.12s ease;
|
|
436
|
+
}
|
|
437
|
+
@keyframes menu-in {
|
|
438
|
+
from { opacity: 0; transform: scale(0.96); }
|
|
439
|
+
}
|
|
440
|
+
#ctx-menu .ctx-label {
|
|
441
|
+
padding: 4px 12px 2px;
|
|
442
|
+
font-size: 9px;
|
|
443
|
+
letter-spacing: 1px;
|
|
444
|
+
text-transform: uppercase;
|
|
445
|
+
color: var(--text-faint);
|
|
446
|
+
cursor: default;
|
|
347
447
|
}
|
|
348
448
|
#ctx-menu .ctx-item {
|
|
349
449
|
padding: 5px 12px;
|
|
@@ -357,6 +457,31 @@
|
|
|
357
457
|
background: var(--purple);
|
|
358
458
|
color: #fff;
|
|
359
459
|
}
|
|
460
|
+
#ctx-menu .ctx-sep {
|
|
461
|
+
height: 1px;
|
|
462
|
+
background: var(--border);
|
|
463
|
+
margin: 3px 6px;
|
|
464
|
+
}
|
|
465
|
+
/* View-mode radio bullets */
|
|
466
|
+
#ctx-menu .ctx-view::before {
|
|
467
|
+
content: '';
|
|
468
|
+
display: inline-block;
|
|
469
|
+
width: 9px; height: 9px;
|
|
470
|
+
border-radius: 50%;
|
|
471
|
+
border: 1px solid var(--text-faint);
|
|
472
|
+
margin-right: 7px;
|
|
473
|
+
vertical-align: -1px;
|
|
474
|
+
box-sizing: border-box;
|
|
475
|
+
}
|
|
476
|
+
#ctx-menu .ctx-view.active::before {
|
|
477
|
+
border-color: var(--purple);
|
|
478
|
+
background: var(--purple);
|
|
479
|
+
box-shadow: inset 0 0 0 2px var(--bg-elev);
|
|
480
|
+
}
|
|
481
|
+
#ctx-menu .ctx-view.active {
|
|
482
|
+
color: var(--purple-soft);
|
|
483
|
+
}
|
|
484
|
+
#ctx-menu .ctx-view.active:hover { color: #fff; }
|
|
360
485
|
|
|
361
486
|
/* ---- Close button (top-right corner) ---- */
|
|
362
487
|
#close-btn {
|
|
@@ -408,7 +533,13 @@
|
|
|
408
533
|
<div id="more-line"></div>
|
|
409
534
|
</div>
|
|
410
535
|
<div id="ctx-menu">
|
|
411
|
-
<div class="ctx-
|
|
536
|
+
<div class="ctx-label">View</div>
|
|
537
|
+
<div class="ctx-item ctx-view" data-view="logo">Cube only</div>
|
|
538
|
+
<div class="ctx-item ctx-view" data-view="mini">Cube + counts</div>
|
|
539
|
+
<div class="ctx-item ctx-view" data-view="standard">Standard</div>
|
|
540
|
+
<div class="ctx-item ctx-view" data-view="detail">Detail</div>
|
|
541
|
+
<div class="ctx-sep"></div>
|
|
542
|
+
<div class="ctx-item" id="ctx-mode">Rotation: Dynamic</div>
|
|
412
543
|
</div>
|
|
413
544
|
<div id="close-btn" title="Close parade">×</div>
|
|
414
545
|
<div id="ws-status" title="WS: connecting"></div>
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<title>Parade Menu</title>
|
|
6
|
+
<!--
|
|
7
|
+
Standalone host for the parade right-click context menu.
|
|
8
|
+
|
|
9
|
+
Why a separate page: the menu used to be a DOM element inside index.html,
|
|
10
|
+
but a page can never paint outside its own window — and the parade window
|
|
11
|
+
can be as small as 100x80 (logo mode), so the menu was truncated. The
|
|
12
|
+
electron main script (paradeWindow.ts) opens this page in a second
|
|
13
|
+
frameless, transparent, always-on-top popup window anchored at the OS
|
|
14
|
+
cursor, so the menu can extend beyond the parade window.
|
|
15
|
+
|
|
16
|
+
Contract with the electron main script:
|
|
17
|
+
- Window size: MENU_W x MENU_H design px (158x147) — the constants in
|
|
18
|
+
paradeWindow.ts MUST match the locked layout below.
|
|
19
|
+
- Query params: ?mode=<displayMode>&rot=<dynamic|static>&zoom=<dpiScale>
|
|
20
|
+
zoom is applied identically to index.html (physical px compensation on
|
|
21
|
+
--force-device-scale-factor=1 Win11; multiply window size by unitScale).
|
|
22
|
+
- Selections: window.paradeMenu.action({type:'view', value}) or
|
|
23
|
+
({type:'rotation'}) → IPC parade-menu-action → relayed to the parade
|
|
24
|
+
window renderer, which stays the single source of truth for mode state.
|
|
25
|
+
-->
|
|
26
|
+
<style>
|
|
27
|
+
:root {
|
|
28
|
+
/* Same design tokens as index.html — keep in sync. */
|
|
29
|
+
--bg-elev: #1d1830;
|
|
30
|
+
--border: rgba(139, 92, 246, 0.18);
|
|
31
|
+
--purple: #8B5CF6;
|
|
32
|
+
--purple-soft: #a78bfa;
|
|
33
|
+
--text: #e7e3f4;
|
|
34
|
+
--text-faint: #5c5575;
|
|
35
|
+
}
|
|
36
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
37
|
+
html, body {
|
|
38
|
+
width: 100%; height: 100%; overflow: hidden;
|
|
39
|
+
/* Transparent so the popup window shows only the menu card. */
|
|
40
|
+
background: transparent;
|
|
41
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
|
|
42
|
+
color: var(--text);
|
|
43
|
+
user-select: none;
|
|
44
|
+
-webkit-font-smoothing: antialiased;
|
|
45
|
+
}
|
|
46
|
+
/* Same card as index.html's #ctx-menu — keep in sync. Line-heights and
|
|
47
|
+
paddings are locked so the total height is exactly 147px regardless of
|
|
48
|
+
system font metrics:
|
|
49
|
+
border 2 + padding 6 + label 17 + 4 items x 23 + sep 7 + item 23 */
|
|
50
|
+
#menu {
|
|
51
|
+
display: block;
|
|
52
|
+
position: fixed;
|
|
53
|
+
top: 0;
|
|
54
|
+
left: 0;
|
|
55
|
+
width: 158px;
|
|
56
|
+
background: var(--bg-elev);
|
|
57
|
+
border: 1px solid var(--border);
|
|
58
|
+
border-radius: 6px;
|
|
59
|
+
padding: 3px;
|
|
60
|
+
box-shadow: 0 4px 16px rgba(0,0,0,0.5);
|
|
61
|
+
transform-origin: top left;
|
|
62
|
+
animation: menu-in 0.12s ease;
|
|
63
|
+
}
|
|
64
|
+
@keyframes menu-in {
|
|
65
|
+
from { opacity: 0; transform: scale(0.96); }
|
|
66
|
+
}
|
|
67
|
+
#menu .ctx-label {
|
|
68
|
+
padding: 4px 12px 2px;
|
|
69
|
+
font-size: 9px;
|
|
70
|
+
line-height: 11px;
|
|
71
|
+
letter-spacing: 1px;
|
|
72
|
+
text-transform: uppercase;
|
|
73
|
+
color: var(--text-faint);
|
|
74
|
+
cursor: default;
|
|
75
|
+
}
|
|
76
|
+
#menu .ctx-item {
|
|
77
|
+
padding: 5px 12px;
|
|
78
|
+
font-size: 11px;
|
|
79
|
+
line-height: 13px;
|
|
80
|
+
color: var(--text);
|
|
81
|
+
cursor: pointer;
|
|
82
|
+
border-radius: 4px;
|
|
83
|
+
transition: background 0.1s;
|
|
84
|
+
}
|
|
85
|
+
#menu .ctx-item:hover {
|
|
86
|
+
background: var(--purple);
|
|
87
|
+
color: #fff;
|
|
88
|
+
}
|
|
89
|
+
#menu .ctx-sep {
|
|
90
|
+
height: 1px;
|
|
91
|
+
background: var(--border);
|
|
92
|
+
margin: 3px 6px;
|
|
93
|
+
}
|
|
94
|
+
/* View-mode radio bullets — same as index.html */
|
|
95
|
+
#menu .ctx-view::before {
|
|
96
|
+
content: '';
|
|
97
|
+
display: inline-block;
|
|
98
|
+
width: 9px; height: 9px;
|
|
99
|
+
border-radius: 50%;
|
|
100
|
+
border: 1px solid var(--text-faint);
|
|
101
|
+
margin-right: 7px;
|
|
102
|
+
vertical-align: -1px;
|
|
103
|
+
box-sizing: border-box;
|
|
104
|
+
}
|
|
105
|
+
#menu .ctx-view.active::before {
|
|
106
|
+
border-color: var(--purple);
|
|
107
|
+
background: var(--purple);
|
|
108
|
+
box-shadow: inset 0 0 0 2px var(--bg-elev);
|
|
109
|
+
}
|
|
110
|
+
#menu .ctx-view.active {
|
|
111
|
+
color: var(--purple-soft);
|
|
112
|
+
}
|
|
113
|
+
#menu .ctx-view.active:hover { color: #fff; }
|
|
114
|
+
</style>
|
|
115
|
+
</head>
|
|
116
|
+
<body>
|
|
117
|
+
<div id="menu">
|
|
118
|
+
<div class="ctx-label">View</div>
|
|
119
|
+
<div class="ctx-item ctx-view" data-view="logo">Cube only</div>
|
|
120
|
+
<div class="ctx-item ctx-view" data-view="mini">Cube + counts</div>
|
|
121
|
+
<div class="ctx-item ctx-view" data-view="standard">Standard</div>
|
|
122
|
+
<div class="ctx-item ctx-view" data-view="detail">Detail</div>
|
|
123
|
+
<div class="ctx-sep"></div>
|
|
124
|
+
<div class="ctx-item" id="ctx-mode">Rotation: Dynamic</div>
|
|
125
|
+
</div>
|
|
126
|
+
<script>
|
|
127
|
+
// Reflect the parade window's current state passed via query string.
|
|
128
|
+
;(function () {
|
|
129
|
+
var q = new URLSearchParams(window.location.search)
|
|
130
|
+
|
|
131
|
+
// DPI compensation — identical mechanism to index.html/cube.js: the main
|
|
132
|
+
// process forces 1 CSS px = 1 physical px on Win11, then we CSS-zoom the
|
|
133
|
+
// content by the OS DPI factor so physical size matches intent. Applied at
|
|
134
|
+
// parse time; the window was sized as design px x unitScale by main.
|
|
135
|
+
var zoom = parseFloat(q.get('zoom')) || 0
|
|
136
|
+
if (zoom > 1) document.documentElement.style.zoom = String(zoom)
|
|
137
|
+
|
|
138
|
+
// Mark the active display mode radio item.
|
|
139
|
+
var mode = q.get('mode') || ''
|
|
140
|
+
var views = document.querySelectorAll('.ctx-view')
|
|
141
|
+
for (let i = 0; i < views.length; i++) {
|
|
142
|
+
if (views[i].getAttribute('data-view') === mode) {
|
|
143
|
+
views[i].classList.add('active')
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Rotation label.
|
|
148
|
+
var rot = q.get('rot') === 'static' ? 'static' : 'dynamic'
|
|
149
|
+
var modeEl = document.getElementById('ctx-mode')
|
|
150
|
+
if (modeEl) {
|
|
151
|
+
modeEl.textContent = 'Rotation: ' + (rot === 'dynamic' ? 'Dynamic' : 'Static')
|
|
152
|
+
}
|
|
153
|
+
})()
|
|
154
|
+
|
|
155
|
+
// Report a selection to the electron main process, which closes the popup and
|
|
156
|
+
// relays the action to the parade window renderer.
|
|
157
|
+
function reportAction(action) {
|
|
158
|
+
if (window.paradeMenu && typeof window.paradeMenu.action === 'function') {
|
|
159
|
+
window.paradeMenu.action(action)
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// View-mode radio items.
|
|
164
|
+
var viewItems = document.querySelectorAll('.ctx-view')
|
|
165
|
+
for (let i = 0; i < viewItems.length; i++) {
|
|
166
|
+
;(function (el) {
|
|
167
|
+
el.addEventListener('click', function () {
|
|
168
|
+
reportAction({ type: 'view', value: el.getAttribute('data-view') })
|
|
169
|
+
})
|
|
170
|
+
})(viewItems[i])
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Rotation toggle — the parade window applies and persists the new mode.
|
|
174
|
+
var modeEl = document.getElementById('ctx-mode')
|
|
175
|
+
if (modeEl) {
|
|
176
|
+
modeEl.addEventListener('click', function () {
|
|
177
|
+
reportAction({ type: 'rotation' })
|
|
178
|
+
})
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Escape dismisses (native-menu parity).
|
|
182
|
+
document.addEventListener('keydown', function (e) {
|
|
183
|
+
if (e.key === 'Escape') {
|
|
184
|
+
try { window.close() } catch (_) { /* ignore */ }
|
|
185
|
+
}
|
|
186
|
+
})
|
|
187
|
+
|
|
188
|
+
// Right-click inside the menu: swallow it (prevents Electron/browser default
|
|
189
|
+
// menus); the parade window's own right-click re-anchors a fresh menu.
|
|
190
|
+
document.addEventListener('contextmenu', function (e) {
|
|
191
|
+
e.preventDefault()
|
|
192
|
+
})
|
|
193
|
+
</script>
|
|
194
|
+
</body>
|
|
195
|
+
</html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{e as d,j as e}from"./vendor-DE_-CLIE.js";import{
|
|
1
|
+
import{e as d,j as e}from"./vendor-DE_-CLIE.js";import{ak as c,al as o,J as m,af as s,a8 as l,x as u}from"./main-CwLwGVDc.js";import"./shiki-mEP5vQQu.js";import"./motion-BILbV7YQ.js";function j(){c();const[a,i]=d.useState([]),{myTeams:r,isLoading:x}=o(),n=d.useCallback(async()=>{try{const t=await m();i(t||[])}catch(t){console.error("Admin: failed to load sessions",t)}},[]);return d.useEffect(()=>{n()},[n]),e.jsx("div",{className:"flex-1 overflow-y-auto",children:e.jsxs("div",{className:"mx-auto max-w-5xl px-4 py-8",children:[e.jsx("h1",{className:"mb-6 font-display text-2xl font-semibold text-text-primary",children:s("admin.title")}),e.jsxs("section",{className:"mb-10",children:[e.jsxs("h2",{className:"mb-4 font-display text-lg font-semibold text-text-primary",children:[s("admin.teams")," (",r.length,")"]}),x?e.jsx("div",{className:"rounded-xl border border-border bg-surface-1 p-4 text-center text-text-muted",children:s("common.loading")}):r.length===0?e.jsx("div",{className:"rounded-xl border border-border bg-surface-1 p-4 text-center text-text-muted",children:s("admin.noTeams")}):e.jsx("div",{className:"space-y-2",children:r.map(t=>e.jsxs("a",{href:`/teams/${t.slug}`,className:"flex items-center justify-between rounded-xl border border-border bg-surface-1 px-4 py-3 no-underline transition-colors hover:border-border-light hover:bg-surface-2",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"font-medium text-text-primary",children:t.name}),e.jsx("span",{className:"ml-2 text-xs text-text-muted",children:t.slug})]}),e.jsx("span",{className:"text-xs text-text-muted",children:l(new Date(t.created_at).getTime()/1e3)})]},t.id))})]}),e.jsxs("section",{children:[e.jsxs("h2",{className:"mb-4 font-display text-lg font-semibold text-text-primary",children:[s("admin.sessions")," (",a.length,")"]}),a.length===0?e.jsx("div",{className:"rounded-xl border border-border bg-surface-1 p-4 text-center text-text-muted",children:s("admin.noSessions")}):e.jsx("div",{className:"space-y-2",children:a.map(t=>e.jsxs("a",{href:`/code/${t.id}`,className:"flex items-center justify-between rounded-xl border border-border bg-surface-1 px-4 py-3 no-underline transition-colors hover:border-border-light hover:bg-surface-2",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"truncate font-medium text-text-primary",children:t.title||t.id}),e.jsx("span",{className:"rounded-full bg-surface-2 px-2 py-0.5 text-xs text-text-muted",children:t.source||"unknown"})]}),e.jsx("div",{className:"truncate text-xs text-text-muted",children:t.id})]}),e.jsxs("div",{className:"ml-4 flex items-center gap-3",children:[e.jsx(u,{status:t.status}),e.jsx("span",{className:"text-xs text-text-muted",children:l(t.updated_at||t.created_at)})]})]},t.id))})]})]})})}export{j as AdminPanel};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{e as r,j as e}from"./vendor-DE_-CLIE.js";import{E as u,J as f}from"./main-CwLwGVDc.js";import"./shiki-mEP5vQQu.js";import"./motion-BILbV7YQ.js";const v=2e3,N=3e4;function E(){const c=window.location.pathname.split("/"),i=c[c.length-1]||"",[s,n]=r.useState("idle"),[m,l]=r.useState(null),[a,d]=r.useState(null);return r.useEffect(()=>{if(!i||!i.startsWith("clm_")){l("Invalid claim token"),n("error");return}n("claiming"),u(i).then(t=>{d(t.environment_id),n("waiting")}).catch(t=>{l(t instanceof Error?t.message:"Claim failed"),n("error")})},[i]),r.useEffect(()=>{if(s!=="waiting"||!a)return;let t=!1;const x=Date.now(),o=setInterval(()=>{if(Date.now()-x>N){clearInterval(o),t||n("timeout");return}f().then(h=>{t||(h||[]).some(p=>p.environment_id===a)&&(clearInterval(o),window.location.href="/code/")}).catch(()=>{})},v);return()=>{t=!0,clearInterval(o)}},[s,a]),s==="claiming"?e.jsx("div",{className:"px-6 py-16 sm:px-10 sm:py-20",children:e.jsx("p",{className:"text-sm text-text-muted",children:"Claiming environment..."})}):s==="error"?e.jsxs("div",{className:"px-6 py-16 sm:px-10 sm:py-20",children:[e.jsx("p",{className:"text-sm text-destructive",children:m}),e.jsx("a",{href:"/code",className:"mt-4 inline-block text-accent hover:underline",children:"Back to dashboard"})]}):s==="waiting"||s==="timeout"?e.jsxs("div",{className:"px-6 py-16 sm:px-10 sm:py-20",children:[e.jsxs("header",{className:"mb-10",children:[e.jsx("h1",{className:"font-display text-2xl font-semibold tracking-tight text-text-primary",children:"Environment claimed"}),e.jsx("p",{className:"mt-2 text-sm text-text-muted",children:"You are now the owner of this environment."})]}),e.jsxs("div",{className:"space-y-4",children:[a&&e.jsx("p",{className:"font-mono text-xs text-text-muted",children:a}),s==="waiting"?e.jsxs("p",{className:"text-sm text-text-muted",children:["Waiting for the worker to create a session",e.jsx("span",{className:"animate-pulse",children:"…"})]}):e.jsx("p",{className:"text-sm text-text-muted",children:"The worker has not created a session yet — it may be offline or stopped. The session will appear on the dashboard once the worker connects."}),e.jsx("a",{href:"/code",className:"inline-block rounded-md bg-accent px-4 py-2 text-sm font-medium text-white hover:bg-accent/90 transition-colors",children:"Go to dashboard"})]})]}):e.jsx("div",{className:"px-6 py-16 sm:px-10 sm:py-20",children:e.jsx("p",{className:"text-sm text-text-muted",children:"Claiming environment..."})})}export{E as Claim};
|