aitu-app 0.6.13 → 0.6.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/assets/{ChatMessagesArea-Btxhq7Z2.js → ChatMessagesArea-BQ33OSbv.js} +4 -4
- package/assets/DialogTaskList-D8vkITTk.js +1 -0
- package/assets/KnowledgeBaseContent-iIzzEUb9.js +143 -0
- package/assets/{ToolboxDrawer-CFAgOmIa.js → ToolboxDrawer-BUixzCAh.js} +14 -14
- package/assets/{ai-analyze-CXbDwr-F.js → ai-analyze-BSLl2uAK.js} +1 -1
- package/assets/ai-image-generation-DvTfL5Pf.js +1 -0
- package/assets/ai-video-generation-mgvQmDxU.js +5 -0
- package/assets/{arc-BVpYfX8u.js → arc-7VZa8sld.js} +1 -1
- package/assets/{arc-Vb6QIvRI.js → arc-CPYfXPW2.js} +1 -1
- package/assets/{batch-image-generation-rvn9zCP-.js → batch-image-generation-C7g9dTtb.js} +5 -5
- package/assets/{blockDiagram-38ab4fdb-CbbmIvT5.js → blockDiagram-38ab4fdb-9wKjan3w.js} +1 -1
- package/assets/{blockDiagram-38ab4fdb-CbUExfWH.js → blockDiagram-38ab4fdb-BfYiey8T.js} +1 -1
- package/assets/{c4Diagram-3d4e48cf-Db1GHdmL.js → c4Diagram-3d4e48cf-Cl1CeBZ9.js} +1 -1
- package/assets/{c4Diagram-3d4e48cf-Dw_8bcgE.js → c4Diagram-3d4e48cf-CvDzfWGg.js} +1 -1
- package/assets/channel-Dq0dBTpp.js +1 -0
- package/assets/channel-QRfYJ0c8.js +1 -0
- package/assets/{classDiagram-70f12bd4-CXXAHxeU.js → classDiagram-70f12bd4-7hx7i_r9.js} +1 -1
- package/assets/{classDiagram-70f12bd4-_p3Dnvx6.js → classDiagram-70f12bd4-C4dqbFYb.js} +1 -1
- package/assets/{classDiagram-v2-f2320105-B-9myg44.js → classDiagram-v2-f2320105-BE6EhyIR.js} +1 -1
- package/assets/{classDiagram-v2-f2320105-ChK1LfBX.js → classDiagram-v2-f2320105-BKvCao98.js} +1 -1
- package/assets/{clipper-CJLNPhZM.js → clipper-DMBYubGg.js} +1 -1
- package/assets/clone-8iorvsVH.js +1 -0
- package/assets/clone-CcaoZaCt.js +1 -0
- package/assets/{createText-2e5e7dd3-BCbwgqBS.js → createText-2e5e7dd3-B5bm44t-.js} +1 -1
- package/assets/{createText-2e5e7dd3-BGRSuPih.js → createText-2e5e7dd3-ClED10Yd.js} +1 -1
- package/assets/{edges-e0da2a9e-BoQQRKl3.js → edges-e0da2a9e-CxYbDWHf.js} +1 -1
- package/assets/{edges-e0da2a9e-1EAOsAGW.js → edges-e0da2a9e-D83AKoY_.js} +1 -1
- package/assets/{erDiagram-9861fffd-DrPXJadW.js → erDiagram-9861fffd-By6KGQIp.js} +1 -1
- package/assets/{erDiagram-9861fffd-DIqIVsjO.js → erDiagram-9861fffd-DklWxrea.js} +1 -1
- package/assets/{flowDb-956e92f1-DKdojl1Z.js → flowDb-956e92f1-B5waKznT.js} +1 -1
- package/assets/{flowDb-956e92f1-_yAXk9b2.js → flowDb-956e92f1-zlQFiVfE.js} +1 -1
- package/assets/{flowDiagram-66a62f08-Cn3BWcxJ.js → flowDiagram-66a62f08-Be1TW-l_.js} +1 -1
- package/assets/{flowDiagram-66a62f08-BSNSE1vH.js → flowDiagram-66a62f08-DN-7_2yD.js} +1 -1
- package/assets/flowDiagram-v2-96b9c2cf-Brfi4xIj.js +1 -0
- package/assets/flowDiagram-v2-96b9c2cf-CPIzTRuX.js +1 -0
- package/assets/{flowchart-elk-definition-4a651766-CkhkUOMa.js → flowchart-elk-definition-4a651766-N0AfQRnQ.js} +1 -1
- package/assets/{flowchart-elk-definition-4a651766-CtRYHypS.js → flowchart-elk-definition-4a651766-r-PtKbtF.js} +1 -1
- package/assets/{ganttDiagram-c361ad54-C-olbHti.js → ganttDiagram-c361ad54-Bht9glx_.js} +1 -1
- package/assets/{ganttDiagram-c361ad54-DWZxEumf.js → ganttDiagram-c361ad54-C2_MLBXD.js} +1 -1
- package/assets/{gitGraphDiagram-72cf32ee-DFI0WJ7k.js → gitGraphDiagram-72cf32ee-2be20W2P.js} +1 -1
- package/assets/{gitGraphDiagram-72cf32ee-Dz3X9B4S.js → gitGraphDiagram-72cf32ee-DbRkmH2_.js} +1 -1
- package/assets/{graph-BbAdRpyG.js → graph-B8wbK8JG.js} +1 -1
- package/assets/{graph-CG3zmXkL.js → graph-Cz6eZWdE.js} +1 -1
- package/assets/{grid-image-CahEQ7p7.js → grid-image-BjBUsyzw.js} +1 -1
- package/assets/{has-Cq7YuzG9.js → has-xmSj69Ai.js} +1 -1
- package/assets/{hasIn-4hPyOh4r.js → hasIn-BEuiXUL_.js} +1 -1
- package/assets/{index-3862675e-D_PJ0qZE.js → index-3862675e-B-TzDFUV.js} +1 -1
- package/assets/{index-3862675e-Cy2LJr-t.js → index-3862675e-DUv0NNEX.js} +1 -1
- package/assets/{index-pt9oZHeu.js → index-BFKE1SDS.js} +1 -1
- package/assets/{index-WyqXHNHN.js → index-BGhQ9HiC.js} +10 -10
- package/assets/{index-C1tgh8XV.js → index-BJPn-Z4H.js} +1 -1
- package/assets/{index-CqEazMaK.js → index-BJt4za3u.js} +1 -1
- package/assets/{index-D9rMZcAy.js → index-BYIrI0Fv.js} +52 -49
- package/assets/index-Bf4QGnyR.css +9 -0
- package/assets/{index-DHrV9sCt.js → index-Bi-3shgC.js} +1 -1
- package/assets/{index-BiCrE7Ci.js → index-Biha89Ph.js} +1 -1
- package/assets/{index-BDnSt0a8.js → index-C7Vp0sfc.js} +1 -1
- package/assets/{index-DtNyBFxZ.js → index-CM5A34wJ.js} +1 -1
- package/assets/{index-XoOCAjmC.js → index-CMqABmj9.js} +1 -1
- package/assets/{index-BOZ3fCzl.js → index-CURBM_KW.js} +1 -1
- package/assets/{index-B4IEsL3l.js → index-CZI4rQ66.js} +1 -1
- package/assets/{index-CYf1zrx4.js → index-Cg0P1L1n.js} +1 -1
- package/assets/{index-B9uNbnfa.js → index-Cg4DzaGJ.js} +1 -1
- package/assets/{index-BZIcMnMw.js → index-Cr7eFaRi.js} +1 -1
- package/assets/{index-7WzIC7_D.js → index-CvvgEQLL.js} +557 -519
- package/assets/index-Cz1tSwF3.css +1 -0
- package/assets/{index-Cx19IgV-.js → index-D35EPyAQ.js} +5 -5
- package/assets/{index-Dv8yvI8G.js → index-D55hpwi0.js} +1 -1
- package/assets/{index-CciPE8zM.js → index-D8hBvwzc.js} +1 -1
- package/assets/{index-BkRTZMZM.js → index-DCPnuU9X.js} +1 -1
- package/assets/{index-Bad6y32x.js → index-DFKy--AY.js} +1 -1
- package/assets/{index-Bco0OAak.js → index-DGrNJ_p2.js} +1 -1
- package/assets/{index-DUgUd4bR.js → index-DZUnWUAx.js} +1 -1
- package/assets/{index-BU3nDlFy.js → index-DergpCoU.js} +1 -1
- package/assets/{index-DBCwQvu4.js → index-Dgpls_LJ.js} +1 -1
- package/assets/{index-jHCkpoWQ.js → index-Dh9OAfqP.js} +1 -1
- package/assets/{index-Dqi7TZna.js → index-DoC8-4hw.js} +2 -2
- package/assets/{index-BQS_8NU3.js → index-DoNZZrMr.js} +1 -1
- package/assets/{index-Bfs6Q-lQ.js → index-Dwd3fQIs.js} +1 -1
- package/assets/{index-BE7n-LiY.js → index-H9okbyq7.js} +1 -1
- package/assets/{index-BOHFUhjZ.js → index-iNzLrLfW.js} +1 -1
- package/assets/index-pQpy2-r1.js +1 -0
- package/assets/{index-ICFaM7Tx.js → index-ukQeGfpm.js} +1 -1
- package/assets/{infoDiagram-f8f76790-D8T-erO4.js → infoDiagram-f8f76790-Ds4mXkkB.js} +1 -1
- package/assets/{infoDiagram-f8f76790-C0TYyx3w.js → infoDiagram-f8f76790-Xs3wpNj_.js} +1 -1
- package/assets/{inspiration-board-CiL8hKbX.js → inspiration-board-aPQmVaUX.js} +1 -1
- package/assets/{isEmpty-BoFRUVaJ.js → isEmpty-BQn8FtDD.js} +1 -1
- package/assets/{journeyDiagram-49397b02-CkmFUv6i.js → journeyDiagram-49397b02-CMj7sdKi.js} +1 -1
- package/assets/{journeyDiagram-49397b02-BHw2LUDu.js → journeyDiagram-49397b02-DAcDgbqb.js} +1 -1
- package/assets/{layers-CaY2-pH6.js → layers-D6Y5pCwe.js} +1 -1
- package/assets/{layout-CSua1dGC.js → layout-DFY48Wfc.js} +1 -1
- package/assets/{layout-D_agYVJ_.js → layout-xjQVmyNt.js} +1 -1
- package/assets/{line-CN9rNlXr.js → line-CS-j1kBY.js} +1 -1
- package/assets/{line-CxGDlzoc.js → line-CnJU8oQA.js} +1 -1
- package/assets/{linear-DKP7SWoM.js → linear-8yUIDV7f.js} +1 -1
- package/assets/{linear-CvStv2Ny.js → linear-BNtDceQW.js} +1 -1
- package/assets/{mermaid.core-DawxQi4y.js → mermaid.core-Bse-qmGl.js} +5 -5
- package/assets/{mindmap-definition-fc14e90a-BWrsnm3I.js → mindmap-definition-fc14e90a-B5pHBBH0.js} +1 -1
- package/assets/{mindmap-definition-fc14e90a-Dmo2lz3K.js → mindmap-definition-fc14e90a-BZEj0_V2.js} +1 -1
- package/assets/{photo-wall-splitter-B_WR4Rl2.js → photo-wall-splitter-DNhSfZ1J.js} +1 -1
- package/assets/pick-Bz9u-Vgl.js +1 -0
- package/assets/{pieDiagram-8a3498a8-DhrponMk.js → pieDiagram-8a3498a8-BX6EY38S.js} +1 -1
- package/assets/{pieDiagram-8a3498a8-CmbWJAb7.js → pieDiagram-8a3498a8-C2SKAWPu.js} +1 -1
- package/assets/{quadrantDiagram-120e2f19-CgIF-y-_.js → quadrantDiagram-120e2f19-C_pOTOg2.js} +1 -1
- package/assets/{quadrantDiagram-120e2f19-DOKwrvFF.js → quadrantDiagram-120e2f19-_4F-o39n.js} +1 -1
- package/assets/{requirementDiagram-deff3bca-BqbqHjdU.js → requirementDiagram-deff3bca-CZBh345Y.js} +1 -1
- package/assets/{requirementDiagram-deff3bca-CIXltTSE.js → requirementDiagram-deff3bca-DUvc5b49.js} +1 -1
- package/assets/{sankeyDiagram-04a897e0-DcPermhl.js → sankeyDiagram-04a897e0-DgwQWZaB.js} +1 -1
- package/assets/{sankeyDiagram-04a897e0-DGiABLdx.js → sankeyDiagram-04a897e0-HlGDp0fm.js} +1 -1
- package/assets/{sequenceDiagram-704730f1-piXYTUjh.js → sequenceDiagram-704730f1-CZleNxPQ.js} +1 -1
- package/assets/{sequenceDiagram-704730f1-BUXJ6XVH.js → sequenceDiagram-704730f1-HXnccUr4.js} +1 -1
- package/assets/{settings-dialog-A3AH7O45.css → settings-dialog-Bf8ExAlc.css} +1 -1
- package/assets/settings-dialog-FIIbAUlz.js +11 -0
- package/assets/{shard-sync-service-BCo2qKEA.js → shard-sync-service-BmLCs0-9.js} +1 -1
- package/assets/{stateDiagram-587899a1-Dnd2X4K4.js → stateDiagram-587899a1-BgbU_RYJ.js} +1 -1
- package/assets/{stateDiagram-587899a1-Cdfs3rRO.js → stateDiagram-587899a1-wcO67Z9P.js} +1 -1
- package/assets/{stateDiagram-v2-d93cdb3a-DtC5XSWV.js → stateDiagram-v2-d93cdb3a-CyibEwON.js} +1 -1
- package/assets/{stateDiagram-v2-d93cdb3a-lOfkWHnS.js → stateDiagram-v2-d93cdb3a-D6v0mGya.js} +1 -1
- package/assets/{styles-6aaf32cf-B_EWv7Bz.js → styles-6aaf32cf-CuwtY8aD.js} +1 -1
- package/assets/{styles-6aaf32cf-BTv8Dnxa.js → styles-6aaf32cf-DPVcUAPG.js} +1 -1
- package/assets/{styles-9a916d00-C4vTAlbK.js → styles-9a916d00-5sadXKIs.js} +1 -1
- package/assets/{styles-9a916d00-BNkP2BU4.js → styles-9a916d00-BlcdlroT.js} +1 -1
- package/assets/{styles-c10674c1-BcxLBYaC.js → styles-c10674c1-DMY3sr0M.js} +1 -1
- package/assets/{styles-c10674c1-Dp5J5JrP.js → styles-c10674c1-fyvfh0rz.js} +2 -2
- package/assets/{svgDrawCommon-08f97a94-CalbTy9V.js → svgDrawCommon-08f97a94-D99zFeK3.js} +1 -1
- package/assets/{svgDrawCommon-08f97a94-5_vuhhyn.js → svgDrawCommon-08f97a94-DCKNxHs0.js} +1 -1
- package/assets/{timeline-definition-85554ec2-DBiJ4h6g.js → timeline-definition-85554ec2-B-Hua8_V.js} +1 -1
- package/assets/{timeline-definition-85554ec2-ByBsrbAq.js → timeline-definition-85554ec2-BJFySUyi.js} +1 -1
- package/assets/{ttd-dialog-C9noZsTQ.js → ttd-dialog-D_LEovv1.js} +4 -4
- package/assets/{upload-DP5n1PVz.js → upload-DPuHWdr4.js} +1 -1
- package/assets/{video-recovery-service-DY01FcHI.js → video-recovery-service-BUo0pCsG.js} +1 -1
- package/assets/{xychartDiagram-e933f94c-CJ1NxG0K.js → xychartDiagram-e933f94c-Cf5Uc503.js} +1 -1
- package/assets/{xychartDiagram-e933f94c-CEXcS3Lw.js → xychartDiagram-e933f94c-Cu1l8Kcq.js} +1 -1
- package/changelog.json +42 -0
- package/package.json +1 -1
- package/precache-manifest.json +279 -279
- package/sw.js +4 -4
- package/version.json +29 -3
- package/assets/DialogTaskList-0I91BD1p.js +0 -1
- package/assets/KnowledgeBaseContent-CSEr1paK.js +0 -153
- package/assets/ai-image-generation-CvUX_vnh.js +0 -1
- package/assets/ai-video-generation-BgDcotXE.js +0 -5
- package/assets/channel-ChluHQU5.js +0 -1
- package/assets/channel-DQ0ggWsj.js +0 -1
- package/assets/clone-BscGHP5K.js +0 -1
- package/assets/clone-CTdvgy2F.js +0 -1
- package/assets/flowDiagram-v2-96b9c2cf-BmoA7Lrr.js +0 -1
- package/assets/flowDiagram-v2-96b9c2cf-Du5Aycbt.js +0 -1
- package/assets/index-C_Ed2LrM.js +0 -1
- package/assets/index-V8UiJyjb.css +0 -1
- package/assets/index-qP_w2VHW.css +0 -9
- package/assets/pick-C1hcXSqm.js +0 -1
- package/assets/settings-dialog-D1OnKj0y.js +0 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
.winbox-settings-window .wb-header{border-bottom-color:#0f172a14!important}.winbox-settings-window .wb-title{font-size:15px;font-weight:700;color:#0f172a}.winbox-settings-window .wb-body{overflow:hidden;background:#fff}.winbox-settings-window .winbox-content-wrapper{padding:0!important;overflow:hidden;background:#fff}@keyframes settings-dialog-spin{to{transform:rotate(360deg)}}@keyframes settings-dialog-mobile-stage-enter{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.settings-dialog{--sd-accent: #f59e0b;--sd-accent-soft: rgba(245, 158, 11, .1);--sd-text: #0f172a;--sd-muted: #64748b;--sd-border: rgba(15, 23, 42, .08);--sd-border-strong: rgba(15, 23, 42, .14);--sd-surface: #ffffff;--sd-surface-soft: #f7f8fa;width:100%;height:100%;min-height:0;display:flex;flex-direction:column;padding:18px;box-sizing:border-box;background:#fff;overflow:hidden}.settings-dialog__layout{display:grid;grid-template-columns:144px minmax(0,1fr);gap:14px;min-height:0;flex:1}.settings-dialog__nav,.settings-dialog__main,.settings-dialog__sidebar,.settings-dialog__content-panel{min-height:0}.settings-dialog__nav-shell{display:flex;flex-direction:column;gap:0;height:100%;padding:4px 0 0 2px}.settings-dialog__nav-list{display:flex;flex-direction:column;gap:4px;min-width:0}.settings-dialog__nav-item{display:flex;flex-direction:column;justify-content:center;min-height:42px;padding:0 10px;text-align:left;position:relative;border:none;border-radius:14px;background:transparent;cursor:pointer;transition:background-color .18s ease,color .18s ease}.settings-dialog__nav-item:hover{background:#f7f8fa}.settings-dialog__nav-item--active{background:#f4f6f9}.settings-dialog__nav-item--active:before{content:"";position:absolute;left:2px;top:10px;bottom:10px;width:2px;border-radius:999px;background:var(--sd-accent)}.settings-dialog__nav-item-title{font-size:14px;font-weight:700;color:var(--sd-text)}.settings-dialog__main{min-width:0;min-height:0;display:flex;flex-direction:column;border-radius:18px;border:1px solid rgba(15,23,42,.05);background:#fff;overflow:hidden}.settings-dialog__workspace{display:grid;grid-template-columns:264px minmax(0,1fr);gap:0;height:100%;min-height:0;flex:1;overflow:hidden}.settings-dialog__workspace--single{grid-template-columns:minmax(0,1fr)}.settings-dialog__sidebar{min-width:0;padding:12px 12px 12px 14px;border-right:1px solid rgba(15,23,42,.05);overflow:hidden}.settings-dialog__sidebar-shell{display:flex;flex-direction:column;gap:10px;height:100%;padding:0;border:none;border-radius:0;background:transparent;box-shadow:none}.settings-dialog__sidebar-shell--catalog{background:transparent}.settings-dialog__sidebar-summary{display:flex;flex-direction:column;gap:2px;padding:2px 4px 0}.settings-dialog__sidebar-summary-row{display:flex;align-items:center;justify-content:space-between;gap:12px}.settings-dialog__sidebar-summary-title{font-size:13px;font-weight:700;color:var(--sd-text)}.settings-dialog__sidebar-summary-text{font-size:12px;line-height:1.5;color:var(--sd-muted)}.settings-dialog__sidebar-summary-action{min-height:30px;padding:0 12px;border:1px solid rgba(245,158,11,.18);border-radius:999px;background:#fffaf0;color:#b45309;font-size:12px;font-weight:700;cursor:pointer;transition:border-color .18s ease,color .18s ease,background-color .18s ease}.settings-dialog__sidebar-summary-action:hover{border-color:#f59e0b4d;background:#fff5de}.settings-dialog__sidebar-list{min-height:0;flex:1;display:flex;flex-direction:column;gap:4px;overflow:auto;padding-right:4px}.settings-dialog__sidebar-list::-webkit-scrollbar{width:5px}.settings-dialog__sidebar-list::-webkit-scrollbar-track{background:transparent}.settings-dialog__sidebar-list::-webkit-scrollbar-thumb{border-radius:999px;background:#94a3b859}.settings-dialog__sidebar-item,.settings-dialog__sidebar-add{width:100%;border-radius:16px}.settings-dialog__sidebar-item{display:flex;flex-direction:column;gap:4px;padding:12px 14px;text-align:left;position:relative;border:1px solid transparent;background:transparent;cursor:pointer;transition:background-color .18s ease,border-color .18s ease,color .18s ease}.settings-dialog__sidebar-item:hover{border-color:transparent;background:#f7f8fa}.settings-dialog__sidebar-item--active{border-color:transparent;background:#f4f6f9}.settings-dialog__sidebar-item--active:before{content:"";position:absolute;left:2px;top:10px;bottom:10px;width:2px;border-radius:999px;background:var(--sd-accent)}.settings-dialog__sidebar-item-top{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:14px;font-weight:700;color:var(--sd-text)}.settings-dialog__sidebar-item-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.settings-dialog__sidebar-item-arrow{flex-shrink:0;color:#94a3b8}.settings-dialog__sidebar-item-meta{display:flex;flex-wrap:wrap;gap:8px;font-size:12px;color:var(--sd-muted)}.settings-dialog__provider-row{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;min-height:56px;padding:4px 8px 4px 6px;position:relative;border-radius:14px;border:1px solid transparent;background:transparent;transition:background-color .18s ease,border-color .18s ease,opacity .18s ease}.settings-dialog__provider-row:hover{border-color:transparent;background:#f7f8fa}.settings-dialog__provider-row--active{border-color:transparent;background:#f4f6f9}.settings-dialog__provider-row--active:before{content:"";position:absolute;left:2px;top:10px;bottom:10px;width:2px;border-radius:999px;background:var(--sd-accent)}.settings-dialog__provider-row--disabled .settings-dialog__provider-name{color:#94a3b8}.settings-dialog__provider-select{min-width:0;min-height:44px;display:inline-flex;align-items:center;justify-content:space-between;gap:12px;padding:0;border:none;background:transparent;color:inherit;cursor:pointer;text-align:left}.settings-dialog__provider-select-main{min-width:0;flex:1;display:inline-flex;align-items:center;gap:10px}.settings-dialog__provider-copy{min-width:0;display:flex;flex-direction:column;align-items:flex-start;gap:4px;flex:1}.settings-dialog__provider-name-row{min-width:0;display:inline-flex;align-items:center;gap:8px}.settings-dialog__provider-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:700;color:var(--sd-text)}.settings-dialog__provider-meta{display:flex;flex-wrap:wrap;gap:8px;font-size:12px;color:var(--sd-muted)}.settings-dialog__provider-avatar{width:32px;height:32px;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;border-radius:10px;overflow:hidden;font-size:14px;font-weight:700;color:#0f172a;background:#f4f6f8}.settings-dialog__provider-avatar--large{width:44px;height:44px;border-radius:14px;font-size:18px}.settings-dialog__provider-avatar--amber{background:#fff3dd;color:#b45309}.settings-dialog__provider-avatar--sky{background:#e6f2ff;color:#2563eb}.settings-dialog__provider-avatar--mint{background:#e7f8f1;color:#0f766e}.settings-dialog__provider-avatar--rose{background:#ffe8ed;color:#be185d}.settings-dialog__provider-avatar--violet{background:#f1ebff;color:#7c3aed}.settings-dialog__provider-avatar-image{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;display:block}.settings-dialog__provider-avatar-text{line-height:1}.settings-dialog__provider-tag{display:inline-flex;align-items:center;min-height:auto;padding:0;border-radius:0;background:transparent;color:#b45309;font-size:10px;font-weight:700}.settings-dialog__provider-switch{display:inline-flex;align-items:center;justify-content:flex-end;gap:8px}.settings-dialog__provider-switch-copy{display:none;font-size:11px;font-weight:700;color:var(--sd-muted)}.settings-dialog__provider-arrow{flex-shrink:0;color:#94a3b8}.settings-dialog__sidebar-badge{display:inline-flex;align-items:center;min-height:20px;padding:0 8px;border-radius:999px;font-size:11px;font-weight:700}.settings-dialog__sidebar-badge--accent{background:var(--sd-accent-soft);color:#b45309}.settings-dialog__sidebar-badge--warning{background:#fbbf2429;color:#b45309}.settings-dialog__sidebar-badge--muted{background:#f1f5f9;color:#475569}.settings-dialog__sidebar-add{min-height:38px;display:inline-flex;align-items:center;justify-content:flex-start;gap:10px;padding:0 8px;border:none;background:transparent;color:#475569;font-size:13px;font-weight:600;cursor:pointer;transition:background-color .18s ease,color .18s ease}.settings-dialog__sidebar-add:hover{background:#f7f8fa;color:#b45309}.settings-dialog__sidebar-add-icon{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:999px;background:#f59e0b24;font-size:16px;line-height:1;color:#b45309}.settings-dialog__content-panel{overflow:auto;display:flex;flex-direction:column;flex:1;gap:14px;padding:14px 16px 16px}.settings-dialog__content-panel::-webkit-scrollbar{width:6px}.settings-dialog__content-panel::-webkit-scrollbar-track{background:transparent}.settings-dialog__content-panel::-webkit-scrollbar-thumb{border-radius:999px;background:#94a3b847}.settings-dialog__content-panel--providers{gap:0;padding:0;border:none;border-radius:0;background:transparent}.settings-dialog__content-panel--providers .settings-dialog__section{padding:16px 18px}.settings-dialog__content-panel--providers .settings-dialog__section+.settings-dialog__section{border-top:1px solid rgba(15,23,42,.06)}.settings-dialog__content-panel--providers .settings-dialog__section--compact{padding-top:14px;padding-bottom:14px}.settings-dialog__content-panel--canvas{padding:14px 16px 16px}.settings-dialog__content-panel--compact,.settings-dialog__content-panel--detail{animation:settings-dialog-mobile-stage-enter .24s ease}.settings-dialog__mobile-stage{display:flex;flex-direction:column;gap:14px}.settings-dialog__compact-stage-header{display:flex;flex-direction:column;gap:10px}.settings-dialog__compact-back{display:inline-flex;align-items:center;gap:6px;align-self:flex-start;min-height:34px;padding:0 12px;border:1px solid rgba(15,23,42,.08);border-radius:999px;background:#fff;color:#334155;font-size:12px;font-weight:700;cursor:pointer;transition:border-color .18s ease,color .18s ease,background-color .18s ease}.settings-dialog__compact-back:hover{border-color:#f59e0b38;color:#b45309;background:#fffaf0}.settings-dialog__compact-stage-copy{display:flex;flex-direction:column;gap:6px}.settings-dialog__compact-stage-eyebrow{font-size:12px;font-weight:700;letter-spacing:.04em;color:#b45309}.settings-dialog__compact-stage-text{margin:0;font-size:13px;line-height:1.6;color:var(--sd-muted)}.settings-dialog__section{display:flex;flex-direction:column;gap:12px;padding:0}.settings-dialog__section-header,.settings-dialog__panel-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.settings-dialog__section-title{margin:0;font-size:16px;font-weight:700;color:var(--sd-text)}.settings-dialog__profile-hero{display:flex;align-items:center;gap:12px;min-width:0}.settings-dialog__profile-hero>div{min-width:0}.settings-dialog__inline-meta{display:flex;flex-wrap:wrap;gap:8px;margin-top:6px;font-size:12px;color:var(--sd-muted)}.settings-dialog__inline-meta span{display:inline-flex;align-items:center;position:relative;min-height:auto;padding:0;border-radius:0;border:none;background:transparent}.settings-dialog__inline-meta span:not(:last-child):after{content:"";width:4px;height:4px;margin-left:8px;border-radius:999px;background:#94a3b899}.settings-dialog__grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.settings-dialog__field{display:flex;gap:10px}.settings-dialog__field--column{flex-direction:column}.settings-dialog__field--full{grid-column:1/-1}.settings-dialog__label{font-size:13px;font-weight:600;color:#334155;letter-spacing:.01em}.settings-dialog__label--stacked{width:auto;text-align:left}.settings-dialog__label-with-tooltip{display:flex;align-items:center;gap:6px}.settings-dialog__label-with-tooltip--left{justify-content:flex-start}.settings-dialog__tooltip-icon{font-size:13px;color:#94a3b8;cursor:pointer}.settings-dialog__field-hint{font-size:12px;color:var(--sd-muted);line-height:1.5}.settings-dialog__input,.settings-dialog__select{width:100%;min-width:0;height:42px;padding:0 13px;border:1px solid var(--sd-border);border-radius:12px;box-sizing:border-box;font-size:14px;color:var(--sd-text);background:#fff;box-shadow:none;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.settings-dialog__input::-moz-placeholder,.settings-dialog__select::-moz-placeholder{color:#94a3b8}.settings-dialog__input::placeholder,.settings-dialog__select::placeholder{color:#94a3b8}.settings-dialog__input:focus,.settings-dialog__select:focus{outline:none;background:#fff;border-color:#f59e0b47;box-shadow:0 0 0 3px #f59e0b14}.settings-dialog__model-toolbar{display:flex;align-items:center;gap:10px;padding:2px 0 4px}.settings-dialog__model-search{display:flex;align-items:center;gap:8px;flex:1;min-width:0;height:38px;padding:0 12px;border:1px solid rgba(15,23,42,.08);border-radius:12px;background:#f8fafc;color:#94a3b8;transition:border-color .18s ease,background-color .18s ease}.settings-dialog__model-search--disabled{background:#f8fafc;color:#cbd5e1}.settings-dialog__model-search input{flex:1;min-width:0;border:0;outline:none;background:transparent;font-size:13px;color:var(--sd-text)}.settings-dialog__model-search input::-moz-placeholder{color:#94a3b8}.settings-dialog__model-search input::placeholder{color:#94a3b8}.settings-dialog__model-search input:disabled{color:#94a3b8;cursor:not-allowed}.settings-dialog__model-search-clear{width:20px;height:20px;border:0;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;background:transparent;color:#94a3b8;cursor:pointer;transition:background-color .18s ease,color .18s ease}.settings-dialog__model-search-clear:hover{background:#94a3b824;color:#475569}.settings-dialog__model-type-groups{display:flex;flex-direction:column;gap:12px}.settings-dialog__model-type-group{display:flex;flex-direction:column;gap:10px;padding:14px 16px 12px;border-radius:16px;background:#fbfcfd}.settings-dialog__model-type-header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-bottom:6px;border-bottom:1px solid rgba(226,232,240,.8)}.settings-dialog__model-type-title{font-size:13px;font-weight:700;color:var(--sd-text)}.settings-dialog__model-type-count{font-size:12px;font-weight:700;color:var(--sd-muted)}.settings-dialog__model-type-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:0 16px}.settings-dialog__model-type-item{--model-brand-accent: #475569;--model-brand-surface: #f8fafc;--model-brand-border: rgba(71, 85, 105, .14);display:flex;align-items:center;gap:10px;min-width:0;padding:10px 2px;border-bottom:1px solid rgba(241,245,249,.88)}.settings-dialog__model-type-item-logo{width:28px;height:28px;flex:none;display:inline-flex;align-items:center;justify-content:center;border-radius:10px;background:var(--model-brand-surface);color:var(--model-brand-accent)}.settings-dialog__model-type-item-copy{min-width:0;display:flex;flex-direction:column;gap:3px}.settings-dialog__model-type-item-id{font-size:13px;color:var(--sd-text);font-weight:600;word-break:break-all}.settings-dialog__model-type-item-vendor{font-size:12px;color:var(--sd-muted)}.settings-dialog__model-empty{display:flex;align-items:center;justify-content:center;min-height:96px;padding:18px;border-radius:16px;background:#f8fafc;font-size:12px;color:var(--sd-muted);text-align:center}.settings-dialog__compat-card{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;border-radius:18px;background:#fffaf0;border:1px solid rgba(245,158,11,.14)}.settings-dialog__compat-title{font-size:13px;font-weight:700;color:#92400e}.settings-dialog__compat-meta{display:flex;flex-wrap:wrap;gap:8px}.settings-dialog__compat-meta span{font-size:12px;color:#78350f}.settings-dialog__notice,.settings-dialog__empty-panel{padding:14px 16px;border-radius:16px;border:1px solid rgba(148,163,184,.18);background:var(--sd-surface-soft);font-size:12px;color:var(--sd-muted)}.settings-dialog__notice--info{border-color:#bfdbfe;background:#eff6ff;color:#1d4ed8}.settings-dialog__notice--success{border-color:#bbf7d0;background:#f0fdf4;color:#15803d}.settings-dialog__notice--warning{border-color:#fde68a;background:#fffbeb;color:#b45309}.settings-dialog__notice--danger{border-color:#fecaca;background:#fef2f2;color:#b91c1c}.settings-dialog__routes{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px}.settings-dialog__route-card{display:flex;flex-direction:column;gap:12px;padding:16px;border-radius:18px;border:1px solid var(--sd-border);background:#fff}.settings-dialog__route-card-top{display:flex;align-items:center;justify-content:space-between;gap:10px}.settings-dialog__route-card-title{font-size:15px;font-weight:700;color:var(--sd-text)}.settings-dialog__route-meta{display:flex;flex-direction:column;gap:6px;font-size:12px;color:var(--sd-muted)}.settings-dialog__stack{display:flex;flex-direction:column;gap:12px}.settings-dialog__inline-row{display:inline-flex;align-items:center;gap:10px;flex-wrap:wrap}.settings-dialog__preference{display:flex;align-items:center;justify-content:space-between;gap:16px;width:100%}.settings-dialog__preference--panel{padding-top:8px}.settings-dialog__toggle-copy{display:flex;flex-direction:column;gap:4px;min-width:0}.settings-dialog__toggle-title{font-size:14px;font-weight:700;color:var(--sd-text)}.settings-dialog__toggle-desc{font-size:12px;color:var(--sd-muted)}.settings-dialog .t-switch{flex-shrink:0}.settings-dialog__actions{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:2px}.settings-dialog__actions-note{font-size:12px;color:var(--sd-muted)}.settings-dialog__actions-group{display:flex;align-items:center;justify-content:flex-end;gap:10px}.settings-dialog__button,.settings-dialog__ghost-button,.settings-dialog__danger-button{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:42px;padding:0 16px;border:1px solid transparent;border-radius:14px;font-size:14px;font-weight:700;cursor:pointer;transition:box-shadow .18s ease,background-color .18s ease,border-color .18s ease,color .18s ease}.settings-dialog__button--cancel{border-color:var(--sd-border);background:#fff;color:#334155}.settings-dialog__button--fetch{min-height:38px;min-width:108px;padding:0 16px;border-color:#111;border-radius:12px;background:#111;color:#fff;box-shadow:none;white-space:nowrap;letter-spacing:.01em}.settings-dialog__button--fetch:hover:not(:disabled){border-color:#000;background:#000;color:#fff}.settings-dialog__button--fetch:disabled{border-color:#e5e7eb;background:#f3f4f6;color:#94a3b8}.settings-dialog__button-spinner{animation:settings-dialog-spin .9s linear infinite}.settings-dialog__ghost-button{background:#fff;border-color:var(--sd-border);color:#334155}.settings-dialog__danger-button{background:transparent;border-color:transparent;color:#b91c1c}.settings-dialog__danger-button:hover{background:#fff5f5;border-color:#f8717124}@media(max-width:980px){.settings-dialog{padding:12px}.settings-dialog__layout,.settings-dialog__workspace{grid-template-columns:1fr;gap:14px}.settings-dialog__model-groups,.settings-dialog__routes,.settings-dialog__grid{grid-template-columns:1fr}.settings-dialog__main{width:100%;max-width:760px;margin:0 auto;border-radius:24px}.settings-dialog__model-toolbar{flex-direction:column;align-items:stretch}.settings-dialog__model-search{width:100%}.settings-dialog__nav{width:100%;max-width:760px;margin:0 auto}.settings-dialog__nav-shell{padding:0;border-bottom:1px solid rgba(15,23,42,.06)}.settings-dialog__nav-list{flex-direction:row;overflow-x:auto;justify-content:center;gap:0;width:100%;max-width:720px;margin:0 auto;padding:0 4px;scrollbar-width:none}.settings-dialog__nav-list::-webkit-scrollbar{display:none}.settings-dialog__nav-item{min-width:0;min-height:56px;flex:1 1 0;align-items:center;padding:0 12px 10px;border-radius:0;text-align:center;color:var(--sd-muted);transform:translateY(0);transition:color .18s ease,transform .18s ease}.settings-dialog__nav-item:hover{background:transparent;color:var(--sd-text)}.settings-dialog__nav-item:after{content:"";position:absolute;left:18px;right:18px;bottom:0;height:3px;border-radius:999px;background:linear-gradient(90deg,#f59e0b,#fbbf24);opacity:0;transform:scaleX(.58);transition:opacity .2s ease,transform .2s ease}.settings-dialog__nav-item--active{background:transparent;color:var(--sd-text);transform:translateY(-1px)}.settings-dialog__nav-item--active:before{display:none}.settings-dialog__nav-item--active:after{opacity:1;transform:scaleX(1)}.settings-dialog__nav-item-title{font-size:15px;text-align:center}.settings-dialog__sidebar{padding:0;border-right:none;border-bottom:none}.settings-dialog__sidebar-shell{height:auto;gap:14px}.settings-dialog__sidebar-shell--catalog .settings-dialog__sidebar-list{gap:0;padding:0;border:1px solid rgba(15,23,42,.08);border-radius:24px;background:#fff;box-shadow:0 12px 28px #0f172a0d;overflow:hidden}.settings-dialog__sidebar-shell--catalog .settings-dialog__provider-row{padding:14px 16px;border:none;border-radius:0;background:transparent;box-shadow:none}.settings-dialog__sidebar-shell--catalog .settings-dialog__provider-row+.settings-dialog__provider-row{border-top:1px solid rgba(226,232,240,.86)}.settings-dialog__sidebar-shell--catalog .settings-dialog__provider-row--active{background:#f59e0b0f;box-shadow:none}.settings-dialog__sidebar-shell--catalog .settings-dialog__provider-switch-copy{display:none}.settings-dialog__sidebar-list{display:flex;flex-direction:column;gap:10px;overflow:auto;padding:4px 0 0}.settings-dialog__sidebar-list::-webkit-scrollbar{width:0}.settings-dialog__sidebar-item,.settings-dialog__provider-row{min-height:auto;scroll-snap-align:none;border-radius:20px;border:1px solid rgba(15,23,42,.08);background:#fff;box-shadow:0 12px 28px #0f172a0d}.settings-dialog__sidebar-item{padding:16px}.settings-dialog__sidebar-item--active{background:linear-gradient(180deg,#fffdf8,#fff);border-color:#f59e0b38;box-shadow:0 16px 32px #f59e0b1a}.settings-dialog__sidebar-item--active:before{display:none}.settings-dialog__provider-row{padding:12px 14px}.settings-dialog__provider-row--active{background:linear-gradient(180deg,#fffdf8,#fff);border-color:#f59e0b38;box-shadow:0 16px 32px #f59e0b1a}.settings-dialog__provider-row--active:before{display:none}.settings-dialog__sidebar-add{justify-content:center;min-height:46px;border:1px dashed rgba(245,158,11,.22);background:#fffaf0;color:#92400e}.settings-dialog__provider-switch{flex-direction:column;align-items:flex-end;gap:6px;min-width:58px}.settings-dialog__provider-switch-copy{display:inline-flex}.settings-dialog__content-panel,.settings-dialog__content-panel--canvas{gap:14px;padding:14px}.settings-dialog__content-panel>.settings-dialog__section,.settings-dialog__content-panel>.settings-dialog__routes,.settings-dialog__content-panel>.settings-dialog__compact-stage-header,.settings-dialog__content-panel>.settings-dialog__mobile-stage,.settings-dialog__content-panel--canvas>.settings-dialog__section,.settings-dialog__content-panel--canvas>.settings-dialog__routes,.settings-dialog__content-panel--canvas>.settings-dialog__compact-stage-header,.settings-dialog__content-panel--canvas>.settings-dialog__mobile-stage{width:100%;max-width:720px;margin-left:auto;margin-right:auto}.settings-dialog__content-panel--providers>.settings-dialog__compact-stage-header{padding:14px 14px 0}.settings-dialog__content-panel--providers .settings-dialog__section{padding:16px;border-radius:22px;border:1px solid rgba(15,23,42,.08);background:#fff;box-shadow:0 14px 34px #0f172a0d}.settings-dialog__content-panel--providers .settings-dialog__section+.settings-dialog__section{margin-top:12px;border-top:none}.settings-dialog__content-panel--canvas{max-width:none}.settings-dialog__content-panel--canvas .settings-dialog__section{padding:18px;border-radius:24px;border:1px solid rgba(15,23,42,.08);background:#fff;box-shadow:0 12px 28px #0f172a0d}.settings-dialog__content-panel--canvas .settings-dialog__section--canvas-card{gap:16px}.settings-dialog__content-panel--canvas .settings-dialog__preference{padding:0;border:none;border-radius:0;background:transparent}.settings-dialog__section-header,.settings-dialog__panel-header,.settings-dialog__compat-card{flex-direction:column;align-items:stretch}.settings-dialog__profile-hero{align-items:flex-start}.settings-dialog__inline-row,.settings-dialog__actions-group{width:100%}.settings-dialog__preference{align-items:stretch;padding:16px 18px;border-radius:20px;background:#ffffffc7;border:1px solid rgba(15,23,42,.06)}.settings-dialog__actions{flex-direction:column;align-items:stretch}.settings-dialog__actions-group{justify-content:stretch}}@media(max-width:640px){.settings-dialog{padding:0}.settings-dialog__button,.settings-dialog__ghost-button,.settings-dialog__danger-button{width:100%}.settings-dialog__nav-item{min-height:52px;padding:0 10px 8px}.settings-dialog__nav-item-title{font-size:13px}.settings-dialog__content-panel,.settings-dialog__content-panel--canvas{gap:12px;padding:10px}.settings-dialog__content-panel--providers>.settings-dialog__compact-stage-header{padding:12px 12px 0}.settings-dialog__content-panel--providers .settings-dialog__section{padding:14px}.settings-dialog__section-title{font-size:15px}.settings-dialog__inline-meta{gap:6px}.settings-dialog__inline-meta span:not(:last-child):after{margin-left:6px}.settings-dialog__field{gap:8px}.settings-dialog__input,.settings-dialog__select{height:44px;font-size:16px}.settings-dialog__model-type-list{grid-template-columns:1fr}.settings-dialog__preference{flex-direction:column;align-items:stretch;gap:12px}.settings-dialog__provider-row{padding:12px}.settings-dialog__provider-switch{justify-content:flex-end}.settings-dialog__provider-switch-copy{display:none}.settings-dialog__sidebar-summary-row{align-items:flex-start;flex-direction:column}.settings-dialog__sidebar-summary-action{width:100%}.settings-dialog__compact-back{width:100%;justify-content:center}}.model-discovery-dialog{--md-text: #0f172a;--md-muted: #64748b;--md-border: #e2e8f0;--md-surface: #ffffff;--md-surface-muted: #f8fafc;width:min(1080px,100vw - 32px);height:min(780px,100vh - 32px);max-height:min(780px,100vh - 32px);display:flex;flex-direction:column;gap:16px;padding:22px 22px 18px;border-radius:24px;background:linear-gradient(180deg,#fbfcfe,#f6f8fc);box-shadow:0 20px 56px #0f172a1f;overflow:hidden}.model-discovery-dialog__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.model-discovery-dialog__headline{display:flex;flex-direction:column;gap:10px;min-width:0}.model-discovery-dialog__title{margin:0;font-size:24px;font-weight:800;color:var(--md-text)}.model-discovery-dialog__header-stats{display:inline-flex;flex-wrap:wrap;gap:8px}.model-discovery-dialog__header-pill{display:inline-flex;align-items:center;min-height:30px;padding:0 12px;border-radius:999px;background:#eef2f7;color:#334155;font-size:12px;font-weight:700}.model-discovery-dialog__header-pill--accent{background:#f59e0b24;color:#b45309}.model-discovery-dialog__close{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border:1px solid var(--md-border);border-radius:999px;background:var(--md-surface);color:#475569;cursor:pointer;transition:background .18s ease,border-color .18s ease,color .18s ease}.model-discovery-dialog__close:hover{border-color:#cbd5e1;background:#f8fafc;color:#0f172a}.model-discovery-dialog__toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px}.model-discovery-dialog__toolbar-actions{display:flex;align-items:center;gap:8px}.model-discovery-dialog__search{display:flex;align-items:center;gap:10px;flex:1;min-width:0;height:42px;padding:0 13px;border:1px solid rgba(15,23,42,.08);border-radius:13px;background:var(--md-surface);color:var(--md-muted);box-shadow:inset 0 1px #fff9}.model-discovery-dialog__search input{flex:1;min-width:0;border:0;outline:none;background:transparent;font-size:14px;color:var(--md-text)}.model-discovery-dialog__ghost-button,.model-discovery-dialog__button{min-height:40px;padding:0 14px;border:0;border-radius:12px;font-size:13px;font-weight:700;cursor:pointer;transition:opacity .18s ease,transform .18s ease,background .18s ease}.model-discovery-dialog__ghost-button:disabled,.model-discovery-dialog__button:disabled{cursor:not-allowed;opacity:.48}.model-discovery-dialog__ghost-button{background:#eef2f7;color:#334155}.model-discovery-dialog__ghost-button:hover:not(:disabled){background:#e2e8f0}.model-discovery-dialog__ghost-button--muted{background:#f1f5f9;color:#64748b}.model-discovery-dialog__type-tabs{display:flex;align-items:center;gap:18px;min-height:40px;padding:0 2px 4px;border-bottom:0}.model-discovery-dialog__type-tab{display:inline-flex;align-items:center;gap:8px;min-height:0;padding:0 0 10px;border:0;border-radius:0;background:transparent;color:#64748b;font-size:13px;font-weight:700;cursor:pointer;position:relative;transition:color .18s ease}.model-discovery-dialog__type-tab:after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px;border-radius:999px;background:transparent;transition:background .18s ease}.model-discovery-dialog__type-tab--active{color:#0f172a}.model-discovery-dialog__type-tab--active:after{background:#f59e0b}.model-discovery-dialog__type-tab:hover{color:#b45309}.model-discovery-dialog__type-tab-count{font-size:12px;color:currentColor;opacity:.82;font-variant-numeric:tabular-nums}.model-discovery-dialog__body{display:flex;flex-direction:column;min-height:0;flex:1;overflow:hidden;padding:10px 0 0;border-radius:20px;background:#fff;box-shadow:inset 0 0 0 1px #0f172a0f}.model-discovery-dialog__group-list{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;display:flex;flex-direction:column;gap:0;padding:0 14px 12px;background:transparent}.model-discovery-dialog__empty{display:flex;align-items:center;justify-content:center;min-height:260px;color:var(--md-muted);font-size:14px}.model-discovery-dialog__vendor-group{--vendor-accent: #475569;--vendor-surface: #f8fafc;--vendor-border: rgba(71, 85, 105, .14);border-bottom:1px solid #eef2f7;background:transparent}.model-discovery-dialog__vendor-header{width:100%;display:flex;align-items:center;justify-content:space-between;gap:14px;padding:14px 4px;border:0;background:transparent;cursor:pointer;text-align:left}.model-discovery-dialog__vendor-main{display:flex;align-items:center;gap:14px;min-width:0}.model-discovery-dialog__vendor-logo-shell{flex:none;display:inline-flex;align-items:center;justify-content:center;color:var(--vendor-accent)}.model-discovery-dialog__vendor-copy{min-width:0;display:flex;align-items:baseline;gap:12px;flex-wrap:wrap}.model-discovery-dialog__vendor-name{font-size:15px;font-weight:800;color:var(--md-text)}.model-discovery-dialog__vendor-meta{display:flex;flex-wrap:wrap;gap:10px}.model-discovery-dialog__vendor-meta-pill{color:#64748b;font-size:11px;font-weight:600}.model-discovery-dialog__vendor-spacer{flex:1;min-width:24px;height:1px;background:#edf2f7}.model-discovery-dialog__vendor-side{display:flex;align-items:center;gap:10px;flex:none}.model-discovery-dialog__vendor-selected{display:inline-flex;align-items:center;color:#b45309;font-size:12px;font-weight:700}.model-discovery-dialog__vendor-count{display:inline-flex;align-items:center;justify-content:center;min-width:30px;height:30px;padding:0 10px;border-radius:999px;background:#f8fafc;color:var(--vendor-accent);font-size:13px;font-weight:800}.model-discovery-dialog__vendor-chevron{width:26px;height:26px;display:inline-flex;align-items:center;justify-content:center;color:#64748b;transition:transform .18s ease}.model-discovery-dialog__vendor-chevron--expanded{transform:rotate(180deg)}.model-discovery-dialog__vendor-body{display:flex;flex-direction:column;gap:12px;overflow:visible;padding:2px 4px 16px 40px;background:transparent}.model-discovery-dialog__type-section{display:flex;flex-direction:column;gap:8px}.model-discovery-dialog__type-section-header{display:flex;align-items:center;justify-content:flex-start;gap:6px;padding-left:0}.model-discovery-dialog__type-section-title{font-size:11px;font-weight:700;color:#94a3b8;letter-spacing:.04em}.model-discovery-dialog__type-section-count{display:none}.model-discovery-dialog__model-stack{display:grid;grid-template-columns:repeat(2,minmax(240px,1fr));gap:0 18px;padding-left:0}.model-discovery-dialog__item{position:relative;display:flex;align-items:center;gap:12px;padding:9px 0;border-bottom:1px solid rgba(241,245,249,.9);background:transparent;cursor:pointer;transition:color .18s ease,opacity .18s ease}.model-discovery-dialog__item:hover{color:var(--vendor-accent);opacity:.88}.model-discovery-dialog__item--checked{color:var(--vendor-accent)}.model-discovery-dialog__checkbox{position:absolute;opacity:0;pointer-events:none}.model-discovery-dialog__checkmark{width:16px;height:16px;flex:none;display:inline-flex;align-items:center;justify-content:center;border:1px solid #cbd5e1;border-radius:6px;background:#fff;color:#fff}.model-discovery-dialog__item--checked .model-discovery-dialog__checkmark{border-color:var(--vendor-accent);background:var(--vendor-accent)}.model-discovery-dialog__item-body{flex:1;min-width:0}.model-discovery-dialog__item-id{font-size:13px;color:var(--md-text);word-break:break-all}.model-discovery-dialog__item-id--checked{font-weight:700}.model-discovery-dialog__footer{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid rgba(15,23,42,.06)}.model-discovery-dialog__selection-count{font-size:12px;color:var(--md-muted)}.model-discovery-dialog__actions{display:flex;align-items:center;gap:8px}.model-discovery-dialog__button--secondary{background:#e2e8f0;color:#334155}.model-discovery-dialog__button--secondary:hover:not(:disabled){background:#cbd5e1}.model-discovery-dialog__button--primary{background:linear-gradient(135deg,#f59e0b,#f97316);color:#fff}.model-discovery-dialog__button--primary:hover:not(:disabled){transform:translateY(-1px)}@media(max-width:900px){.model-discovery-dialog{width:min(100vw - 16px,100%);height:calc(100vh - 16px);max-height:calc(100vh - 16px);padding:16px}.model-discovery-dialog__toolbar,.model-discovery-dialog__footer,.model-discovery-dialog__vendor-header{flex-direction:column;align-items:stretch}.model-discovery-dialog__vendor-copy{align-items:flex-start}.model-discovery-dialog__vendor-spacer{display:none}.model-discovery-dialog__toolbar-actions,.model-discovery-dialog__actions{width:100%}.model-discovery-dialog__toolbar-actions>*,.model-discovery-dialog__actions>*{flex:1}.model-discovery-dialog__vendor-side{justify-content:flex-end}.model-discovery-dialog__type-tabs{gap:14px;overflow-x:auto;overflow-y:hidden;padding-bottom:8px;scrollbar-width:none}.model-discovery-dialog__type-tabs::-webkit-scrollbar{display:none}.model-discovery-dialog__type-section{gap:6px}.model-discovery-dialog__model-stack{grid-template-columns:1fr;padding-left:0}.model-discovery-dialog__type-section-header{padding-left:0}}
|
|
1
|
+
.winbox-settings-window .wb-header{border-bottom-color:#0f172a14!important}.winbox-settings-window .wb-title{font-size:15px;font-weight:700;color:#0f172a}.winbox-settings-window .wb-body{overflow:hidden;background:#fff}.winbox-settings-window .winbox-content-wrapper{padding:0!important;overflow:hidden;background:#fff}@keyframes settings-dialog-spin{to{transform:rotate(360deg)}}@keyframes settings-dialog-mobile-stage-enter{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.settings-dialog{--sd-accent: #f59e0b;--sd-accent-soft: rgba(245, 158, 11, .1);--sd-text: #0f172a;--sd-muted: #64748b;--sd-border: rgba(15, 23, 42, .08);--sd-border-strong: rgba(15, 23, 42, .14);--sd-surface: #ffffff;--sd-surface-soft: #f7f8fa;width:100%;height:100%;min-height:0;display:flex;flex-direction:column;padding:18px;box-sizing:border-box;background:#fff;overflow:hidden}.settings-dialog__layout{display:grid;grid-template-columns:144px minmax(0,1fr);gap:14px;min-height:0;flex:1}.settings-dialog__nav,.settings-dialog__main,.settings-dialog__sidebar,.settings-dialog__content-panel{min-height:0}.settings-dialog__nav-shell{display:flex;flex-direction:column;gap:0;height:100%;padding:4px 0 0 2px}.settings-dialog__nav-list{display:flex;flex-direction:column;gap:4px;min-width:0}.settings-dialog__nav-item{display:flex;flex-direction:column;justify-content:center;min-height:42px;padding:0 10px;text-align:left;position:relative;border:none;border-radius:14px;background:transparent;cursor:pointer;transition:background-color .18s ease,color .18s ease}.settings-dialog__nav-item:hover{background:#f7f8fa}.settings-dialog__nav-item--active{background:#f4f6f9}.settings-dialog__nav-item--active:before{content:"";position:absolute;left:2px;top:10px;bottom:10px;width:2px;border-radius:999px;background:var(--sd-accent)}.settings-dialog__nav-item-title{font-size:14px;font-weight:700;color:var(--sd-text)}.settings-dialog__main{min-width:0;min-height:0;display:flex;flex-direction:column;border-radius:18px;border:1px solid rgba(15,23,42,.05);background:#fff;overflow:hidden}.settings-dialog__workspace{display:grid;grid-template-columns:264px minmax(0,1fr);gap:0;height:100%;min-height:0;flex:1;overflow:hidden}.settings-dialog__workspace--single{grid-template-columns:minmax(0,1fr)}.settings-dialog__sidebar{min-width:0;padding:12px 12px 12px 14px;border-right:1px solid rgba(15,23,42,.05);overflow:hidden}.settings-dialog__sidebar-shell{display:flex;flex-direction:column;gap:10px;height:100%;padding:0;border:none;border-radius:0;background:transparent;box-shadow:none}.settings-dialog__sidebar-shell--catalog{background:transparent}.settings-dialog__sidebar-summary{display:flex;flex-direction:column;gap:2px;padding:2px 4px 0}.settings-dialog__sidebar-summary-row{display:flex;align-items:center;justify-content:space-between;gap:12px}.settings-dialog__sidebar-summary-title{font-size:13px;font-weight:700;color:var(--sd-text)}.settings-dialog__sidebar-summary-text{font-size:12px;line-height:1.5;color:var(--sd-muted)}.settings-dialog__sidebar-summary-action{min-height:30px;padding:0 12px;border:1px solid rgba(245,158,11,.18);border-radius:999px;background:#fffaf0;color:#b45309;font-size:12px;font-weight:700;cursor:pointer;transition:border-color .18s ease,color .18s ease,background-color .18s ease}.settings-dialog__sidebar-summary-action:hover{border-color:#f59e0b4d;background:#fff5de}.settings-dialog__sidebar-list{min-height:0;flex:1;display:flex;flex-direction:column;gap:4px;overflow:auto;padding-right:4px}.settings-dialog__sidebar-list::-webkit-scrollbar{width:5px}.settings-dialog__sidebar-list::-webkit-scrollbar-track{background:transparent}.settings-dialog__sidebar-list::-webkit-scrollbar-thumb{border-radius:999px;background:#94a3b859}.settings-dialog__sidebar-item,.settings-dialog__sidebar-add{width:100%;border-radius:16px}.settings-dialog__sidebar-item{display:flex;flex-direction:column;gap:4px;padding:12px 14px;text-align:left;position:relative;border:1px solid transparent;background:transparent;cursor:pointer;transition:background-color .18s ease,border-color .18s ease,color .18s ease}.settings-dialog__sidebar-item:hover{border-color:transparent;background:#f7f8fa}.settings-dialog__sidebar-item--active{border-color:transparent;background:#f4f6f9}.settings-dialog__sidebar-item--active:before{content:"";position:absolute;left:2px;top:10px;bottom:10px;width:2px;border-radius:999px;background:var(--sd-accent)}.settings-dialog__sidebar-item-top{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:14px;font-weight:700;color:var(--sd-text)}.settings-dialog__sidebar-item-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.settings-dialog__sidebar-item-arrow{flex-shrink:0;color:#94a3b8}.settings-dialog__sidebar-item-meta{display:flex;flex-wrap:wrap;gap:8px;font-size:12px;color:var(--sd-muted)}.settings-dialog__provider-row{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;min-height:56px;padding:4px 8px 4px 6px;position:relative;border-radius:14px;border:1px solid transparent;background:transparent;transition:background-color .18s ease,border-color .18s ease,opacity .18s ease}.settings-dialog__provider-row:hover{border-color:transparent;background:#f7f8fa}.settings-dialog__provider-row--active{border-color:transparent;background:#f4f6f9}.settings-dialog__provider-row--active:before{content:"";position:absolute;left:2px;top:10px;bottom:10px;width:2px;border-radius:999px;background:var(--sd-accent)}.settings-dialog__provider-row--disabled .settings-dialog__provider-name{color:#94a3b8}.settings-dialog__provider-select{min-width:0;min-height:44px;display:inline-flex;align-items:center;justify-content:space-between;gap:12px;padding:0;border:none;background:transparent;color:inherit;cursor:pointer;text-align:left}.settings-dialog__provider-select-main{min-width:0;flex:1;display:inline-flex;align-items:center;gap:10px}.settings-dialog__provider-copy{min-width:0;display:flex;flex-direction:column;align-items:flex-start;gap:4px;flex:1}.settings-dialog__provider-name-row{min-width:0;display:inline-flex;align-items:center;gap:8px}.settings-dialog__provider-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:700;color:var(--sd-text)}.settings-dialog__provider-meta{display:flex;flex-wrap:wrap;gap:8px;font-size:12px;color:var(--sd-muted)}.settings-dialog__provider-avatar{width:32px;height:32px;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;border-radius:10px;overflow:hidden;font-size:14px;font-weight:700;color:#0f172a;background:#f4f6f8}.settings-dialog__provider-avatar--large{width:44px;height:44px;border-radius:14px;font-size:18px}.settings-dialog__provider-avatar--amber{background:#fff3dd;color:#b45309}.settings-dialog__provider-avatar--sky{background:#e6f2ff;color:#2563eb}.settings-dialog__provider-avatar--mint{background:#e7f8f1;color:#0f766e}.settings-dialog__provider-avatar--rose{background:#ffe8ed;color:#be185d}.settings-dialog__provider-avatar--violet{background:#f1ebff;color:#7c3aed}.settings-dialog__provider-avatar-image{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;display:block}.settings-dialog__provider-avatar-text{line-height:1}.settings-dialog__provider-tag{display:inline-flex;align-items:center;min-height:auto;padding:0;border-radius:0;background:transparent;color:#b45309;font-size:10px;font-weight:700}.settings-dialog__provider-switch{display:inline-flex;align-items:center;justify-content:flex-end;gap:8px}.settings-dialog__provider-switch-copy{display:none;font-size:11px;font-weight:700;color:var(--sd-muted)}.settings-dialog__provider-arrow{flex-shrink:0;color:#94a3b8}.settings-dialog__sidebar-badge{display:inline-flex;align-items:center;min-height:20px;padding:0 8px;border-radius:999px;font-size:11px;font-weight:700}.settings-dialog__sidebar-badge--accent{background:var(--sd-accent-soft);color:#b45309}.settings-dialog__sidebar-badge--warning{background:#fbbf2429;color:#b45309}.settings-dialog__sidebar-badge--muted{background:#f1f5f9;color:#475569}.settings-dialog__sidebar-add{min-height:38px;display:inline-flex;align-items:center;justify-content:flex-start;gap:10px;padding:0 8px;border:none;background:transparent;color:#475569;font-size:13px;font-weight:600;cursor:pointer;transition:background-color .18s ease,color .18s ease}.settings-dialog__sidebar-add:hover{background:#f7f8fa;color:#b45309}.settings-dialog__sidebar-add-icon{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:999px;background:#f59e0b24;font-size:16px;line-height:1;color:#b45309}.settings-dialog__content-panel{overflow:auto;display:flex;flex-direction:column;flex:1;gap:14px;padding:14px 16px 16px}.settings-dialog__content-panel::-webkit-scrollbar{width:6px}.settings-dialog__content-panel::-webkit-scrollbar-track{background:transparent}.settings-dialog__content-panel::-webkit-scrollbar-thumb{border-radius:999px;background:#94a3b847}.settings-dialog__content-panel--providers{gap:0;padding:0;border:none;border-radius:0;background:transparent}.settings-dialog__content-panel--providers .settings-dialog__section{padding:16px 18px}.settings-dialog__content-panel--providers .settings-dialog__section+.settings-dialog__section{border-top:1px solid rgba(15,23,42,.06)}.settings-dialog__content-panel--providers .settings-dialog__section--compact{padding-top:14px;padding-bottom:14px}.settings-dialog__content-panel--canvas{padding:14px 16px 16px}.settings-dialog__content-panel--compact,.settings-dialog__content-panel--detail{animation:settings-dialog-mobile-stage-enter .24s ease}.settings-dialog__mobile-stage{display:flex;flex-direction:column;gap:14px}.settings-dialog__compact-stage-header{display:flex;flex-direction:column;gap:10px}.settings-dialog__compact-back{display:inline-flex;align-items:center;gap:6px;align-self:flex-start;min-height:34px;padding:0 12px;border:1px solid rgba(15,23,42,.08);border-radius:999px;background:#fff;color:#334155;font-size:12px;font-weight:700;cursor:pointer;transition:border-color .18s ease,color .18s ease,background-color .18s ease}.settings-dialog__compact-back:hover{border-color:#f59e0b38;color:#b45309;background:#fffaf0}.settings-dialog__compact-stage-copy{display:flex;flex-direction:column;gap:6px}.settings-dialog__compact-stage-eyebrow{font-size:12px;font-weight:700;letter-spacing:.04em;color:#b45309}.settings-dialog__compact-stage-text{margin:0;font-size:13px;line-height:1.6;color:var(--sd-muted)}.settings-dialog__section{display:flex;flex-direction:column;gap:12px;padding:0}.settings-dialog__section-header,.settings-dialog__panel-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.settings-dialog__section-title{margin:0;font-size:16px;font-weight:700;color:var(--sd-text)}.settings-dialog__profile-hero{display:flex;align-items:center;gap:12px;min-width:0}.settings-dialog__profile-hero>div{min-width:0}.settings-dialog__inline-meta{display:flex;flex-wrap:wrap;gap:8px;margin-top:6px;font-size:12px;color:var(--sd-muted)}.settings-dialog__inline-meta span{display:inline-flex;align-items:center;position:relative;min-height:auto;padding:0;border-radius:0;border:none;background:transparent}.settings-dialog__inline-meta span:not(:last-child):after{content:"";width:4px;height:4px;margin-left:8px;border-radius:999px;background:#94a3b899}.settings-dialog__grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.settings-dialog__field{display:flex;gap:10px}.settings-dialog__field--column{flex-direction:column}.settings-dialog__field--full{grid-column:1/-1}.settings-dialog__label{font-size:13px;font-weight:600;color:#334155;letter-spacing:.01em}.settings-dialog__label--stacked{width:auto;text-align:left}.settings-dialog__label-with-tooltip{display:flex;align-items:center;gap:6px}.settings-dialog__label-with-tooltip--left{justify-content:flex-start}.settings-dialog__tooltip-icon{font-size:13px;color:#94a3b8;cursor:pointer}.settings-dialog__field-hint{font-size:12px;color:var(--sd-muted);line-height:1.5}.settings-dialog__input,.settings-dialog__select{width:100%;min-width:0;height:42px;padding:0 13px;border:1px solid var(--sd-border);border-radius:12px;box-sizing:border-box;font-size:14px;color:var(--sd-text);background:#fff;box-shadow:none;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.settings-dialog__input::-moz-placeholder,.settings-dialog__select::-moz-placeholder{color:#94a3b8}.settings-dialog__input::placeholder,.settings-dialog__select::placeholder{color:#94a3b8}.settings-dialog__input:focus,.settings-dialog__select:focus{outline:none;background:#fff;border-color:#f59e0b47;box-shadow:0 0 0 3px #f59e0b14}.settings-dialog__model-toolbar{display:flex;align-items:center;gap:10px;padding:2px 0 4px}.settings-dialog__model-search{display:flex;align-items:center;gap:8px;flex:1;min-width:0;height:38px;padding:0 12px;border:1px solid rgba(15,23,42,.08);border-radius:12px;background:#f8fafc;color:#94a3b8;transition:border-color .18s ease,background-color .18s ease}.settings-dialog__model-search--disabled{background:#f8fafc;color:#cbd5e1}.settings-dialog__model-search input{flex:1;min-width:0;border:0;outline:none;background:transparent;font-size:13px;color:var(--sd-text)}.settings-dialog__model-search input::-moz-placeholder{color:#94a3b8}.settings-dialog__model-search input::placeholder{color:#94a3b8}.settings-dialog__model-search input:disabled{color:#94a3b8;cursor:not-allowed}.settings-dialog__model-search-clear{width:20px;height:20px;border:0;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;background:transparent;color:#94a3b8;cursor:pointer;transition:background-color .18s ease,color .18s ease}.settings-dialog__model-search-clear:hover{background:#94a3b824;color:#475569}.settings-dialog__model-type-groups{display:flex;flex-direction:column;gap:12px}.settings-dialog__model-type-group{display:flex;flex-direction:column;gap:10px;padding:14px 16px 12px;border-radius:16px;background:#fbfcfd}.settings-dialog__model-type-header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-bottom:6px;border-bottom:1px solid rgba(226,232,240,.8)}.settings-dialog__model-type-title{font-size:13px;font-weight:700;color:var(--sd-text)}.settings-dialog__model-type-count{font-size:12px;font-weight:700;color:var(--sd-muted)}.settings-dialog__model-type-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:0 16px}.settings-dialog__model-type-item{--model-brand-accent: #475569;--model-brand-surface: #f8fafc;--model-brand-border: rgba(71, 85, 105, .14);display:flex;align-items:center;gap:10px;min-width:0;padding:10px 2px;border-bottom:1px solid rgba(241,245,249,.88)}.settings-dialog__model-type-item-logo{width:28px;height:28px;flex:none;display:inline-flex;align-items:center;justify-content:center;border-radius:10px;background:var(--model-brand-surface);color:var(--model-brand-accent)}.settings-dialog__model-type-item-copy{min-width:0;display:flex;flex-direction:column;gap:3px}.settings-dialog__model-type-item-id{font-size:13px;color:var(--sd-text);font-weight:600;word-break:break-all}.settings-dialog__model-type-item-vendor{font-size:12px;color:var(--sd-muted)}.settings-dialog__model-empty{display:flex;align-items:center;justify-content:center;min-height:96px;padding:18px;border-radius:16px;background:#f8fafc;font-size:12px;color:var(--sd-muted);text-align:center}.settings-dialog__compat-card{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;border-radius:18px;background:#fffaf0;border:1px solid rgba(245,158,11,.14)}.settings-dialog__compat-title{font-size:13px;font-weight:700;color:#92400e}.settings-dialog__compat-meta{display:flex;flex-wrap:wrap;gap:8px}.settings-dialog__compat-meta span{font-size:12px;color:#78350f}.settings-dialog__notice,.settings-dialog__empty-panel{padding:14px 16px;border-radius:16px;border:1px solid rgba(148,163,184,.18);background:var(--sd-surface-soft);font-size:12px;color:var(--sd-muted)}.settings-dialog__notice--info{border-color:#bfdbfe;background:#eff6ff;color:#1d4ed8}.settings-dialog__notice--success{border-color:#bbf7d0;background:#f0fdf4;color:#15803d}.settings-dialog__notice--warning{border-color:#fde68a;background:#fffbeb;color:#b45309}.settings-dialog__notice--danger{border-color:#fecaca;background:#fef2f2;color:#b91c1c}.settings-dialog__routes{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px}.settings-dialog__route-card{display:flex;flex-direction:column;gap:12px;padding:16px;border-radius:18px;border:1px solid var(--sd-border);background:#fff}.settings-dialog__route-card-top{display:flex;align-items:center;justify-content:space-between;gap:10px}.settings-dialog__route-card-title{font-size:15px;font-weight:700;color:var(--sd-text)}.settings-dialog__route-meta{display:flex;flex-direction:column;gap:6px;font-size:12px;color:var(--sd-muted)}.settings-dialog__stack{display:flex;flex-direction:column;gap:12px}.settings-dialog__inline-row{display:inline-flex;align-items:center;gap:10px;flex-wrap:wrap}.settings-dialog__preference{display:flex;align-items:center;justify-content:space-between;gap:16px;width:100%}.settings-dialog__preference--panel{padding-top:8px}.settings-dialog__toggle-copy{display:flex;flex-direction:column;gap:4px;min-width:0}.settings-dialog__toggle-title{font-size:14px;font-weight:700;color:var(--sd-text)}.settings-dialog__toggle-desc{font-size:12px;color:var(--sd-muted)}.settings-dialog .t-switch{flex-shrink:0}.settings-dialog__actions{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:2px}.settings-dialog__actions-note{font-size:12px;color:var(--sd-muted)}.settings-dialog__actions-group{display:flex;align-items:center;justify-content:flex-end;gap:10px}.settings-dialog__button,.settings-dialog__ghost-button,.settings-dialog__danger-button{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:42px;padding:0 16px;border:1px solid transparent;border-radius:14px;font-size:14px;font-weight:700;cursor:pointer;transition:box-shadow .18s ease,background-color .18s ease,border-color .18s ease,color .18s ease}.settings-dialog__button--cancel{border-color:var(--sd-border);background:#fff;color:#334155}.settings-dialog__button--fetch{min-height:38px;min-width:108px;padding:0 16px;border-color:#111;border-radius:12px;background:#111;color:#fff;box-shadow:none;white-space:nowrap;letter-spacing:.01em}.settings-dialog__button--fetch:hover:not(:disabled){border-color:#000;background:#000;color:#fff}.settings-dialog__button--fetch:disabled{border-color:#e5e7eb;background:#f3f4f6;color:#94a3b8}.settings-dialog__button-spinner{animation:settings-dialog-spin .9s linear infinite}.settings-dialog__ghost-button{background:#fff;border-color:var(--sd-border);color:#334155}.settings-dialog__danger-button{background:transparent;border-color:transparent;color:#b91c1c}.settings-dialog__danger-button:hover{background:#fff5f5;border-color:#f8717124}@media(max-width:980px){.settings-dialog{padding:12px}.settings-dialog__layout,.settings-dialog__workspace{grid-template-columns:1fr;gap:14px}.settings-dialog__model-groups,.settings-dialog__routes,.settings-dialog__grid{grid-template-columns:1fr}.settings-dialog__main{width:100%;max-width:760px;margin:0 auto;border-radius:24px}.settings-dialog__model-toolbar{flex-direction:column;align-items:stretch}.settings-dialog__model-search{width:100%}.settings-dialog__nav{width:100%;max-width:760px;margin:0 auto}.settings-dialog__nav-shell{padding:0;border-bottom:1px solid rgba(15,23,42,.06)}.settings-dialog__nav-list{flex-direction:row;overflow-x:auto;justify-content:center;gap:0;width:100%;max-width:720px;margin:0 auto;padding:0 4px;scrollbar-width:none}.settings-dialog__nav-list::-webkit-scrollbar{display:none}.settings-dialog__nav-item{min-width:0;min-height:56px;flex:1 1 0;align-items:center;padding:0 12px 10px;border-radius:0;text-align:center;color:var(--sd-muted);transform:translateY(0);transition:color .18s ease,transform .18s ease}.settings-dialog__nav-item:hover{background:transparent;color:var(--sd-text)}.settings-dialog__nav-item:after{content:"";position:absolute;left:18px;right:18px;bottom:0;height:3px;border-radius:999px;background:linear-gradient(90deg,#f59e0b,#fbbf24);opacity:0;transform:scaleX(.58);transition:opacity .2s ease,transform .2s ease}.settings-dialog__nav-item--active{background:transparent;color:var(--sd-text);transform:translateY(-1px)}.settings-dialog__nav-item--active:before{display:none}.settings-dialog__nav-item--active:after{opacity:1;transform:scaleX(1)}.settings-dialog__nav-item-title{font-size:15px;text-align:center}.settings-dialog__sidebar{padding:0;border-right:none;border-bottom:none}.settings-dialog__sidebar-shell{height:auto;gap:14px}.settings-dialog__sidebar-shell--catalog .settings-dialog__sidebar-list{gap:0;padding:0;border:1px solid rgba(15,23,42,.08);border-radius:24px;background:#fff;box-shadow:0 12px 28px #0f172a0d;overflow:hidden}.settings-dialog__sidebar-shell--catalog .settings-dialog__provider-row{padding:14px 16px;border:none;border-radius:0;background:transparent;box-shadow:none}.settings-dialog__sidebar-shell--catalog .settings-dialog__provider-row+.settings-dialog__provider-row{border-top:1px solid rgba(226,232,240,.86)}.settings-dialog__sidebar-shell--catalog .settings-dialog__provider-row--active{background:#f59e0b0f;box-shadow:none}.settings-dialog__sidebar-shell--catalog .settings-dialog__provider-switch-copy{display:none}.settings-dialog__sidebar-list{display:flex;flex-direction:column;gap:10px;overflow:auto;padding:4px 0 0}.settings-dialog__sidebar-list::-webkit-scrollbar{width:0}.settings-dialog__sidebar-item,.settings-dialog__provider-row{min-height:auto;scroll-snap-align:none;border-radius:20px;border:1px solid rgba(15,23,42,.08);background:#fff;box-shadow:0 12px 28px #0f172a0d}.settings-dialog__sidebar-item{padding:16px}.settings-dialog__sidebar-item--active{background:linear-gradient(180deg,#fffdf8,#fff);border-color:#f59e0b38;box-shadow:0 16px 32px #f59e0b1a}.settings-dialog__sidebar-item--active:before{display:none}.settings-dialog__provider-row{padding:12px 14px}.settings-dialog__provider-row--active{background:linear-gradient(180deg,#fffdf8,#fff);border-color:#f59e0b38;box-shadow:0 16px 32px #f59e0b1a}.settings-dialog__provider-row--active:before{display:none}.settings-dialog__sidebar-add{justify-content:center;min-height:46px;border:1px dashed rgba(245,158,11,.22);background:#fffaf0;color:#92400e}.settings-dialog__provider-switch{flex-direction:column;align-items:flex-end;gap:6px;min-width:58px}.settings-dialog__provider-switch-copy{display:inline-flex}.settings-dialog__content-panel,.settings-dialog__content-panel--canvas{gap:14px;padding:14px}.settings-dialog__content-panel>.settings-dialog__section,.settings-dialog__content-panel>.settings-dialog__routes,.settings-dialog__content-panel>.settings-dialog__compact-stage-header,.settings-dialog__content-panel>.settings-dialog__mobile-stage,.settings-dialog__content-panel--canvas>.settings-dialog__section,.settings-dialog__content-panel--canvas>.settings-dialog__routes,.settings-dialog__content-panel--canvas>.settings-dialog__compact-stage-header,.settings-dialog__content-panel--canvas>.settings-dialog__mobile-stage{width:100%;max-width:720px;margin-left:auto;margin-right:auto}.settings-dialog__content-panel--providers>.settings-dialog__compact-stage-header{padding:14px 14px 0}.settings-dialog__content-panel--providers .settings-dialog__section{padding:16px;border-radius:22px;border:1px solid rgba(15,23,42,.08);background:#fff;box-shadow:0 14px 34px #0f172a0d}.settings-dialog__content-panel--providers .settings-dialog__section+.settings-dialog__section{margin-top:12px;border-top:none}.settings-dialog__content-panel--canvas{max-width:none}.settings-dialog__content-panel--canvas .settings-dialog__section{padding:18px;border-radius:24px;border:1px solid rgba(15,23,42,.08);background:#fff;box-shadow:0 12px 28px #0f172a0d}.settings-dialog__content-panel--canvas .settings-dialog__section--canvas-card{gap:16px}.settings-dialog__content-panel--canvas .settings-dialog__preference{padding:0;border:none;border-radius:0;background:transparent}.settings-dialog__section-header,.settings-dialog__panel-header,.settings-dialog__compat-card{flex-direction:column;align-items:stretch}.settings-dialog__profile-hero{align-items:flex-start}.settings-dialog__inline-row,.settings-dialog__actions-group{width:100%}.settings-dialog__preference{align-items:stretch;padding:16px 18px;border-radius:20px;background:#ffffffc7;border:1px solid rgba(15,23,42,.06)}.settings-dialog__actions{flex-direction:column;align-items:stretch}.settings-dialog__actions-group{justify-content:stretch}}@media(max-width:640px){.settings-dialog{padding:0}.settings-dialog__button,.settings-dialog__ghost-button,.settings-dialog__danger-button{width:100%}.settings-dialog__nav-item{min-height:52px;padding:0 10px 8px}.settings-dialog__nav-item-title{font-size:13px}.settings-dialog__content-panel,.settings-dialog__content-panel--canvas{gap:12px;padding:10px}.settings-dialog__content-panel--providers>.settings-dialog__compact-stage-header{padding:12px 12px 0}.settings-dialog__content-panel--providers .settings-dialog__section{padding:14px}.settings-dialog__section-title{font-size:15px}.settings-dialog__inline-meta{gap:6px}.settings-dialog__inline-meta span:not(:last-child):after{margin-left:6px}.settings-dialog__field{gap:8px}.settings-dialog__input,.settings-dialog__select{height:44px;font-size:16px}.settings-dialog__model-type-list{grid-template-columns:1fr}.settings-dialog__preference{flex-direction:column;align-items:stretch;gap:12px}.settings-dialog__provider-row{padding:12px}.settings-dialog__provider-switch{justify-content:flex-end}.settings-dialog__provider-switch-copy{display:none}.settings-dialog__sidebar-summary-row{align-items:flex-start;flex-direction:column}.settings-dialog__sidebar-summary-action{width:100%}.settings-dialog__compact-back{width:100%;justify-content:center}}.model-discovery-dialog{--md-text: #0f172a;--md-muted: #64748b;--md-border: #e2e8f0;--md-surface: #ffffff;--md-surface-muted: #f8fafc;width:min(1080px,100vw - 32px);height:min(780px,100vh - 32px);max-height:min(780px,100vh - 32px);display:flex;flex-direction:column;gap:16px;padding:22px 22px 18px;border-radius:24px;background:linear-gradient(180deg,#fbfcfe,#f6f8fc);box-shadow:0 20px 56px #0f172a1f;overflow:hidden}.model-discovery-dialog__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.model-discovery-dialog__headline{display:flex;flex-direction:column;gap:10px;min-width:0}.model-discovery-dialog__title{margin:0;font-size:24px;font-weight:800;color:var(--md-text)}.model-discovery-dialog__header-stats{display:inline-flex;flex-wrap:wrap;gap:8px}.model-discovery-dialog__header-pill{display:inline-flex;align-items:center;min-height:30px;padding:0 12px;border-radius:999px;background:#eef2f7;color:#334155;font-size:12px;font-weight:700}.model-discovery-dialog__header-pill--accent{background:#f59e0b24;color:#b45309}.model-discovery-dialog__close{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border:1px solid var(--md-border);border-radius:999px;background:var(--md-surface);color:#475569;cursor:pointer;transition:background .18s ease,border-color .18s ease,color .18s ease}.model-discovery-dialog__close:hover{border-color:#cbd5e1;background:#f8fafc;color:#0f172a}.model-discovery-dialog__toolbar{display:flex;align-items:center;gap:12px}.model-discovery-dialog__search{display:flex;align-items:center;gap:10px;flex:1;min-width:0;height:42px;padding:0 13px;border:1px solid rgba(15,23,42,.08);border-radius:13px;background:var(--md-surface);color:var(--md-muted);box-shadow:inset 0 1px #fff9}.model-discovery-dialog__search input{flex:1;min-width:0;border:0;outline:none;background:transparent;font-size:14px;color:var(--md-text)}.model-discovery-dialog__ghost-button,.model-discovery-dialog__button{min-height:40px;padding:0 14px;border:0;border-radius:12px;font-size:13px;font-weight:700;cursor:pointer;transition:opacity .18s ease,transform .18s ease,background .18s ease}.model-discovery-dialog__ghost-button:disabled,.model-discovery-dialog__button:disabled{cursor:not-allowed;opacity:.48}.model-discovery-dialog__ghost-button{background:#eef2f7;color:#334155}.model-discovery-dialog__ghost-button:hover:not(:disabled){background:#e2e8f0}.model-discovery-dialog__ghost-button--muted{background:#f1f5f9;color:#64748b}.model-discovery-dialog__type-tabs{display:flex;align-items:center;gap:18px;min-height:40px;padding:0 2px 4px;border-bottom:0}.model-discovery-dialog__type-tab{display:inline-flex;align-items:center;gap:8px;min-height:0;padding:0 0 10px;border:0;border-radius:0;background:transparent;color:#64748b;font-size:13px;font-weight:700;cursor:pointer;position:relative;transition:color .18s ease}.model-discovery-dialog__type-tab:after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px;border-radius:999px;background:transparent;transition:background .18s ease}.model-discovery-dialog__type-tab--active{color:#0f172a}.model-discovery-dialog__type-tab--active:after{background:#f59e0b}.model-discovery-dialog__type-tab:hover{color:#b45309}.model-discovery-dialog__type-tab-count{font-size:12px;color:currentColor;opacity:.82;font-variant-numeric:tabular-nums}.model-discovery-dialog__body{display:flex;flex-direction:column;min-height:0;flex:1;overflow:hidden;padding:10px 0 0;border-radius:20px;background:#fff;box-shadow:inset 0 0 0 1px #0f172a0f}.model-discovery-dialog__group-list{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;display:flex;flex-direction:column;gap:0;padding:0 14px 12px;background:transparent}.model-discovery-dialog__empty{display:flex;align-items:center;justify-content:center;min-height:260px;color:var(--md-muted);font-size:14px}.model-discovery-dialog__vendor-group{--vendor-accent: #475569;--vendor-surface: #f8fafc;--vendor-border: rgba(71, 85, 105, .14);border-bottom:1px solid #eef2f7;background:transparent}.model-discovery-dialog__vendor-header{width:100%;display:flex;align-items:center;justify-content:space-between;gap:14px;padding:14px 4px;border:0;background:transparent;cursor:pointer;text-align:left}.model-discovery-dialog__vendor-main{display:flex;align-items:center;gap:14px;min-width:0}.model-discovery-dialog__vendor-logo-shell{flex:none;display:inline-flex;align-items:center;justify-content:center;color:var(--vendor-accent)}.model-discovery-dialog__vendor-copy{min-width:0;display:flex;align-items:baseline;gap:12px;flex-wrap:wrap}.model-discovery-dialog__vendor-name{font-size:15px;font-weight:800;color:var(--md-text)}.model-discovery-dialog__vendor-meta{display:flex;flex-wrap:wrap;gap:10px}.model-discovery-dialog__vendor-meta-pill{color:#64748b;font-size:11px;font-weight:600}.model-discovery-dialog__vendor-spacer{flex:1;min-width:24px;height:1px;background:#edf2f7}.model-discovery-dialog__vendor-side{display:flex;align-items:center;gap:10px;flex:none}.model-discovery-dialog__vendor-selected{display:inline-flex;align-items:center;color:#b45309;font-size:12px;font-weight:700}.model-discovery-dialog__vendor-count{display:inline-flex;align-items:center;justify-content:center;min-width:30px;height:30px;padding:0 10px;border-radius:999px;background:#f8fafc;color:var(--vendor-accent);font-size:13px;font-weight:800}.model-discovery-dialog__vendor-chevron{width:26px;height:26px;display:inline-flex;align-items:center;justify-content:center;color:#64748b;transition:transform .18s ease}.model-discovery-dialog__vendor-chevron--expanded{transform:rotate(180deg)}.model-discovery-dialog__vendor-body{display:flex;flex-direction:column;gap:12px;overflow:visible;padding:2px 4px 16px 40px;background:transparent}.model-discovery-dialog__type-section{display:flex;flex-direction:column;gap:8px}.model-discovery-dialog__type-section-header{display:flex;align-items:center;justify-content:flex-start;gap:6px;padding-left:0}.model-discovery-dialog__type-section-title{font-size:11px;font-weight:700;color:#94a3b8;letter-spacing:.04em}.model-discovery-dialog__type-section-count{display:none}.model-discovery-dialog__model-stack{display:grid;grid-template-columns:repeat(2,minmax(240px,1fr));gap:0 18px;padding-left:0}.model-discovery-dialog__item{position:relative;display:flex;align-items:center;gap:12px;padding:9px 0;border-bottom:1px solid rgba(241,245,249,.9);background:transparent;cursor:pointer;transition:color .18s ease,opacity .18s ease}.model-discovery-dialog__item:hover{color:var(--vendor-accent);opacity:.88}.model-discovery-dialog__item--checked{color:var(--vendor-accent)}.model-discovery-dialog__checkbox{position:absolute;opacity:0;pointer-events:none}.model-discovery-dialog__checkmark{width:16px;height:16px;flex:none;display:inline-flex;align-items:center;justify-content:center;border:1px solid #cbd5e1;border-radius:6px;background:#fff;color:#fff}.model-discovery-dialog__item--checked .model-discovery-dialog__checkmark{border-color:var(--vendor-accent);background:var(--vendor-accent)}.model-discovery-dialog__item-body{flex:1;min-width:0}.model-discovery-dialog__item-id{font-size:13px;color:var(--md-text);word-break:break-all}.model-discovery-dialog__item-id--checked{font-weight:700}.model-discovery-dialog__footer{display:flex;align-items:center;gap:12px;padding-top:14px;border-top:1px solid rgba(15,23,42,.06)}.model-discovery-dialog__footer-bulk{display:flex;align-items:center;gap:8px;margin-left:auto}.model-discovery-dialog__selection-count{font-size:12px;color:var(--md-muted)}.model-discovery-dialog__actions{display:flex;align-items:center;gap:8px}.model-discovery-dialog__button--secondary{background:#e2e8f0;color:#334155}.model-discovery-dialog__button--secondary:hover:not(:disabled){background:#cbd5e1}.model-discovery-dialog__button--primary{background:linear-gradient(135deg,#f59e0b,#f97316);color:#fff}.model-discovery-dialog__button--primary:hover:not(:disabled){transform:translateY(-1px)}@media(max-width:900px){.model-discovery-dialog{width:min(100vw - 16px,100%);height:calc(100vh - 16px);max-height:calc(100vh - 16px);padding:16px}.model-discovery-dialog__toolbar,.model-discovery-dialog__footer,.model-discovery-dialog__vendor-header{flex-direction:column;align-items:stretch}.model-discovery-dialog__vendor-copy{align-items:flex-start}.model-discovery-dialog__vendor-spacer{display:none}.model-discovery-dialog__actions,.model-discovery-dialog__footer-bulk{width:100%}.model-discovery-dialog__actions>*,.model-discovery-dialog__footer-bulk>*{flex:1}.model-discovery-dialog__vendor-side{justify-content:flex-end}.model-discovery-dialog__type-tabs{gap:14px;overflow-x:auto;overflow-y:hidden;padding-bottom:8px;scrollbar-width:none}.model-discovery-dialog__type-tabs::-webkit-scrollbar{display:none}.model-discovery-dialog__type-section{gap:6px}.model-discovery-dialog__model-stack{grid-template-columns:1fr;padding-left:0}.model-discovery-dialog__type-section-header{padding-left:0}}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import{bS as ps,r as u,I as st,_ as tt,aQ as e,bT as it,bU as at,bV as xs,bW as Ns,bX as js,bY as fs,bZ as Ee,b_ as nt,b$ as lt,c0 as ys,c1 as dt,a_ as ot,c2 as O,c3 as J,c4 as rt,c5 as be,c6 as Ne,c7 as X,v as je,c8 as le,x as ee,C as se,F as te,b7 as Me,c9 as ct,ca as ve,bc as V,cb as is,cc as as,cd as ns,aR as gt,ce as Se,cf as ke,cg as fe,ch as z,ci as ie,aW as ae,cj as mt,ck as _t,cl as ut,cm as ht}from"./index-CvvgEQLL.js";import{cn as Yt,co as Qt}from"./index-CvvgEQLL.js";/**
|
|
2
|
+
* @license lucide-react v0.562.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const vt=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],pt=ps("loader-circle",vt);/**
|
|
7
|
+
* @license lucide-react v0.562.0 - ISC
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under the ISC license.
|
|
10
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
+
*/const xt=[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]],Nt=ps("triangle-alert",xt);function ls(t,n){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var m=Object.getOwnPropertySymbols(t);n&&(m=m.filter(function(x){return Object.getOwnPropertyDescriptor(t,x).enumerable})),i.push.apply(i,m)}return i}function ds(t){for(var n=1;n<arguments.length;n++){var i=arguments[n]!=null?arguments[n]:{};n%2?ls(Object(i),!0).forEach(function(m){tt(t,m,i[m])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):ls(Object(i)).forEach(function(m){Object.defineProperty(t,m,Object.getOwnPropertyDescriptor(i,m))})}return t}var jt={tag:"svg",attrs:{fill:"none",viewBox:"0 0 24 24",width:"1em",height:"1em"},children:[{tag:"path",attrs:{fill:"currentColor",d:"M12 21C16.9706 21 21 16.9706 21 12C21 7.02944 16.9706 3 12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21ZM23 12C23 18.0751 18.0751 23 12 23C5.92487 23 0.999999 18.0751 1 12C1 5.92487 5.92487 0.999999 12 1C18.0751 1 23 5.92487 23 12ZM11 17.5L11 10H13L13 17.5L11 17.5ZM13 8.5H10.9961L10.9961 6.49609H13L13 8.5Z"}}]},bs=u.forwardRef(function(t,n){return u.createElement(st,ds(ds({},t),{},{id:"info-circle",ref:n,icon:jt}))});bs.displayName="InfoCircleIcon";const os={all:"全部",image:"图片",video:"视频",audio:"音频",text:"文本"},ft={image:"图片",video:"视频",audio:"音频",text:"文本"},yt={image:"图",video:"视",audio:"音",text:"文"},rs=["text","image","video","audio"];function bt(t,n){const i=n.trim().toLowerCase();return i?[t.id,t.label,t.shortLabel,t.shortCode,t.description,t.sourceProfileName,Ee(t.vendor)].filter(Boolean).some(m=>m==null?void 0:m.toLowerCase().includes(i)):!0}function Mt(t){return[...t].sort((n,i)=>{const m=(n.shortLabel||n.label||n.id).toLowerCase(),x=(i.shortLabel||i.label||i.id).toLowerCase();return m.localeCompare(x,"zh-Hans-CN")})}function cs(t,n){const i=new Map;for(const x of t){const D=i.get(x.vendor)||{vendor:x.vendor,models:[],counts:{image:0,video:0,audio:0,text:0},selectedCount:0};D.models.push(x),D.counts[x.type]+=1,n.has(x.id)&&(D.selectedCount+=1),i.set(x.vendor,D)}const m=new Map(ys.map((x,D)=>[x,D]));return Array.from(i.values()).sort((x,D)=>{const k=m.get(x.vendor)??Number.MAX_SAFE_INTEGER,Z=m.get(D.vendor)??Number.MAX_SAFE_INTEGER;return k!==Z?k-Z:D.models.length-x.models.length})}function St(t){return["image","video","audio","text"].filter(n=>t.counts[n]>0).map(n=>({type:n,models:Mt(t.models.filter(i=>i.type===n))})).sort((n,i)=>i.models.length!==n.models.length?i.models.length-n.models.length:rs.indexOf(n.type)-rs.indexOf(i.type))}const Ct=({open:t,container:n,models:i,selectedModelIds:m,onClose:x,onConfirm:D})=>{const[k,Z]=u.useState(""),[U,Y]=u.useState("all"),[$,K]=u.useState(m),[b,F]=u.useState({});u.useEffect(()=>{var E,W;if(!t)return;Z(""),Y("all"),K(m);const o=new Set(m),y=cs(i,o),v=((E=y.find(L=>L.selectedCount>0))==null?void 0:E.vendor)||((W=y[0])==null?void 0:W.vendor)||null,C={};y.forEach(L=>{C[L.vendor]=L.vendor===v}),F(C)},[i,t,m]);const S=u.useMemo(()=>({all:i.length,image:i.filter(o=>o.type==="image").length,video:i.filter(o=>o.type==="video").length,audio:i.filter(o=>o.type==="audio").length,text:i.filter(o=>o.type==="text").length}),[i]),R=u.useMemo(()=>{const o=k.trim(),y=U==="all"?i:i.filter(v=>v.type===U);return o?y.filter(v=>bt(v,o)):y},[U,i,k]),w=u.useMemo(()=>new Set($),[$]),T=u.useMemo(()=>cs(R,w),[w,R]),pe=$.length,ne=u.useMemo(()=>({image:i.filter(o=>o.type==="image"&&w.has(o.id)).length,video:i.filter(o=>o.type==="video"&&w.has(o.id)).length,text:i.filter(o=>o.type==="text"&&w.has(o.id)).length}),[i,w]),oe=R.length>0&&R.every(o=>w.has(o.id));u.useEffect(()=>{T.length===0||T.some(v=>b[v.vendor])||!Object.values(b).some(Boolean)||F(T.reduce((v,C,E)=>(v[C.vendor]=E===0,v),{}))},[b,T]);const xe=o=>{K(y=>y.includes(o)?y.filter(v=>v!==o):[...y,o])},q=()=>{const o=R.map(v=>v.id),y=o.every(v=>w.has(v));K(v=>y?v.filter(C=>!o.includes(C)):Array.from(new Set([...v,...o])))},re=o=>{F(y=>{const v=!y[o],C={};return T.forEach(E=>{C[E.vendor]=E.vendor===o?v:!1}),C})};return e.jsx(it,{open:t,onOpenChange:o=>!o&&x(),children:e.jsxs(at,{className:"model-discovery-dialog",container:n,"data-testid":"model-discovery-dialog",children:[e.jsxs("div",{className:"model-discovery-dialog__header",children:[e.jsxs("div",{className:"model-discovery-dialog__headline",children:[e.jsx("h3",{className:"model-discovery-dialog__title",children:"获取模型"}),e.jsxs("div",{className:"model-discovery-dialog__header-stats",children:[e.jsxs("span",{className:"model-discovery-dialog__header-pill",children:["已发现 ",i.length]}),e.jsxs("span",{className:"model-discovery-dialog__header-pill",children:["品牌 ",T.length]}),e.jsxs("span",{className:"model-discovery-dialog__header-pill model-discovery-dialog__header-pill--accent",children:["已选 ",pe]})]})]}),e.jsx("button",{type:"button",className:"model-discovery-dialog__close",onClick:x,"aria-label":"关闭",children:e.jsx(xs,{size:18})})]}),e.jsx("div",{className:"model-discovery-dialog__toolbar",children:e.jsxs("label",{className:"model-discovery-dialog__search",children:[e.jsx(Ns,{size:16}),e.jsx("input",{type:"text",value:k,onChange:o=>Z(o.target.value),placeholder:"搜索模型名称、ID 或品牌"})]})}),e.jsx("div",{className:"model-discovery-dialog__type-tabs",children:Object.keys(os).map(o=>{const y=U===o;return e.jsxs("button",{type:"button",className:`model-discovery-dialog__type-tab ${y?"model-discovery-dialog__type-tab--active":""}`,onClick:()=>Y(o),children:[e.jsx("span",{children:os[o]}),e.jsx("span",{className:"model-discovery-dialog__type-tab-count",children:S[o]})]},o)})}),e.jsx("div",{className:"model-discovery-dialog__body",children:T.length===0?e.jsx("div",{className:"model-discovery-dialog__empty",children:k.trim()?"没有匹配的模型":"暂无模型"}):e.jsx("div",{className:"model-discovery-dialog__group-list",children:T.map(o=>{const y=js(o.vendor),v=St(o),C=!!b[o.vendor];return e.jsxs("section",{className:`model-discovery-dialog__vendor-group ${C?"model-discovery-dialog__vendor-group--expanded":""}`,style:{"--vendor-accent":y.accent,"--vendor-surface":y.surface,"--vendor-border":y.border},children:[e.jsxs("button",{type:"button",className:"model-discovery-dialog__vendor-header",onClick:()=>re(o.vendor),children:[e.jsxs("div",{className:"model-discovery-dialog__vendor-main",children:[e.jsx("span",{className:"model-discovery-dialog__vendor-logo-shell",children:e.jsx(fs,{vendor:o.vendor,size:22})}),e.jsxs("div",{className:"model-discovery-dialog__vendor-copy",children:[e.jsx("span",{className:"model-discovery-dialog__vendor-name",children:Ee(o.vendor)}),e.jsx("div",{className:"model-discovery-dialog__vendor-meta",children:v.map(({type:E,models:W})=>e.jsxs("span",{className:"model-discovery-dialog__vendor-meta-pill",children:[yt[E]," ",W.length]},`${o.vendor}-${E}`))})]})]}),e.jsx("span",{className:"model-discovery-dialog__vendor-spacer"}),e.jsxs("div",{className:"model-discovery-dialog__vendor-side",children:[o.selectedCount>0?e.jsxs("span",{className:"model-discovery-dialog__vendor-selected",children:["已选 ",o.selectedCount]}):null,e.jsx("span",{className:"model-discovery-dialog__vendor-count",children:o.models.length}),e.jsx("span",{className:`model-discovery-dialog__vendor-chevron ${C?"model-discovery-dialog__vendor-chevron--expanded":""}`,children:e.jsx(nt,{size:16})})]})]}),C?e.jsx("div",{className:"model-discovery-dialog__vendor-body",children:v.map(({type:E,models:W})=>e.jsxs("div",{className:"model-discovery-dialog__type-section",children:[e.jsxs("div",{className:"model-discovery-dialog__type-section-header",children:[e.jsx("span",{className:"model-discovery-dialog__type-section-title",children:ft[E]}),e.jsx("span",{className:"model-discovery-dialog__type-section-count",children:W.length})]}),e.jsx("div",{className:"model-discovery-dialog__model-stack",children:W.map(L=>{const Q=w.has(L.id);return e.jsxs("label",{className:`model-discovery-dialog__item ${Q?"model-discovery-dialog__item--checked":""}`,children:[e.jsx("input",{type:"checkbox",className:"model-discovery-dialog__checkbox",checked:Q,onChange:()=>xe(L.id)}),e.jsx("span",{className:"model-discovery-dialog__checkmark",children:Q?e.jsx(lt,{size:12}):null}),e.jsx("div",{className:"model-discovery-dialog__item-body",children:e.jsx("div",{className:`model-discovery-dialog__item-id ${Q?"model-discovery-dialog__item-id--checked":""}`,children:L.id})})]},L.id)})})]},`${o.vendor}-${E}`))}):null]},o.vendor)})})}),e.jsxs("div",{className:"model-discovery-dialog__footer",children:[e.jsxs("span",{className:"model-discovery-dialog__selection-count",children:["已选 ",pe," 个 · 图 ",ne.image," / 视"," ",ne.video," / 文 ",ne.text]}),e.jsxs("div",{className:"model-discovery-dialog__footer-bulk",children:[e.jsx("button",{type:"button",className:"model-discovery-dialog__ghost-button",onClick:q,disabled:R.length===0,children:oe?"取消全选":"全选"}),e.jsx("button",{type:"button",className:"model-discovery-dialog__ghost-button model-discovery-dialog__ghost-button--muted",onClick:()=>K([]),disabled:$.length===0,children:"清空"})]}),e.jsxs("div",{className:"model-discovery-dialog__actions",children:[e.jsx("button",{type:"button",className:"model-discovery-dialog__button model-discovery-dialog__button--secondary",onClick:x,children:"取消"}),e.jsx("button",{type:"button",className:"model-discovery-dialog__button model-discovery-dialog__button--primary",onClick:()=>D($),children:"添加模型"})]})]})]})})},Et=[{value:"providers",label:"供应商"},{value:"presets",label:"模型预设"},{value:"canvas",label:"画布显示"}],Pt=["openai-compatible","gemini-compatible","custom"],It=["bearer","header","query","custom"],wt={image:"图片",video:"视频",audio:"音频",text:"文本"},At={image:"图片模型",video:"视频模型",audio:"音频模型",text:"文本模型"},Ot=["text","image","video","audio"],Te={"openai-compatible":{label:"OpenAI 兼容"},"gemini-compatible":{label:"Gemini 兼容"},custom:{label:"自定义接入"}},Dt={bearer:{label:"Bearer Token"},header:{label:"自定义 Header"},query:{label:"Query 参数"},custom:{label:"手动拼装"}},gs=["amber","sky","mint","rose","violet"];function ms(t){return t.reduce((n,i)=>(n[i.type]+=1,n),{image:0,video:0,audio:0,text:0})}function Rt(t,n){const i=n.trim().toLowerCase();return i?[t.id,t.label,t.shortLabel,t.shortCode,t.description,t.sourceProfileName,Ee(t.vendor)].filter(Boolean).some(m=>m==null?void 0:m.toLowerCase().includes(i)):!0}function _s(t){return t?["image","video","audio","text"].filter(n=>!!z(t[n])).length:0}function kt(t,n){const i=n.find(m=>m.id===t.id);return i?Kt(i,t)?"saved":"dirty":"new"}function Ce(t){return JSON.stringify(t)}function Tt(t){return typeof t.iconUrl!="string"?null:t.iconUrl.trim()||null}function Lt(t){var m;const n=t.trim();if(!n)return"供";const i=n.match(/[A-Za-z0-9]+/g);return i!=null&&i[0]?i[0][0].toUpperCase():((m=Array.from(n)[0])==null?void 0:m.toUpperCase())||"供"}function Vt(t){const n=Array.from(`${t.id}-${t.providerType}-${t.name}`).reduce((i,m,x)=>i+m.charCodeAt(0)*(x+1),0);return gs[n%gs.length]}function de(t){return JSON.parse(JSON.stringify(t))}function Ms(t){return`${t}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}function zt(t){return{id:Ms("profile"),name:`供应商 ${t}`,iconUrl:"",providerType:"openai-compatible",baseUrl:"",apiKey:"",authType:Le(),enabled:!0,capabilities:{supportsModelsEndpoint:!0,supportsText:!0,supportsImage:!0,supportsVideo:!0,supportsAudio:!0,supportsTools:!0}}}function Le(t){return"bearer"}function us(t){return t===O||t===ut}const hs=({profile:t,size:n="regular"})=>{const i=Tt(t),[m,x]=u.useState(i);u.useEffect(()=>{x(i)},[i]);const D=Vt(t),k=Lt(t.name);return e.jsx("span",{className:`settings-dialog__provider-avatar settings-dialog__provider-avatar--${D} ${n==="large"?"settings-dialog__provider-avatar--large":""}`,"aria-hidden":"true",children:m?e.jsx("img",{src:m,alt:`${t.name} 图标`,className:"settings-dialog__provider-avatar-image",loading:"lazy",onError:()=>x(null)}):e.jsx("span",{className:"settings-dialog__provider-avatar-text",children:k})})};function Ut(t,n){return{id:Ms("preset"),name:"新预设",text:ie(ae(t,n.text||null)),image:ie(ae(t,n.image||null)),video:ie(ae(t,n.video||null)),audio:ie(ae(t,n.audio||null))}}function $t(t,n,i){const m=t[n],x=i.defaultModelRef!==void 0?i.defaultModelRef:ae(i.profileId!==void 0?i.profileId:fe(m),i.defaultModelId!==void 0?i.defaultModelId:z(m));return{...t,[n]:ie(x)}}function Bt(t,n){const i={...t};return["image","video","audio","text"].forEach(m=>{fe(i[m])===n&&(i[m]=ie(null))}),i}function Kt(t,n){return JSON.stringify(t)===JSON.stringify(n)}function vs(t,n){return JSON.stringify({profileId:t,modelId:n})}function Ft(t){if(!t)return null;try{const n=JSON.parse(t);return ae(n.profileId||null,n.modelId||null)}catch{return null}}const Zt=({container:t})=>{const{appState:n,setAppState:i}=dt(),{isMobile:m,viewportWidth:x,viewportHeight:D}=ot(),[k,Z]=u.useState("providers"),[U,Y]=u.useState(O),[$,K]=u.useState(J),[b,F]=u.useState([]),[S,R]=u.useState([]),[w,T]=u.useState(J),[pe,ne]=u.useState([]),[oe,xe]=u.useState(""),[q,re]=u.useState(""),[o,y]=u.useState(""),[v,C]=u.useState(""),[E,W]=u.useState(!0),[L,Q]=u.useState(""),[Ve,ye]=u.useState(!1),[Ss,Pe]=u.useState(""),[ze,Ue]=u.useState(!1),[Cs,ce]=u.useState("catalog"),[Es,ge]=u.useState("catalog"),_=b.find(s=>s.id===U)||b[0]||null,I=S.find(s=>s.id===$)||S[0]||null,B=rt((_==null?void 0:_.id)||O),Ps=u.useDeferredValue(L),$e=be(O,"image"),Is=be(O,"audio"),Be=be(O,"video"),Ke=be(O,"text"),ws=b.filter(s=>s.enabled),N=m||x<=980,Ie=!!_&&!!_.apiKey.trim(),As=Ce({profiles:b,presets:S,activePresetId:w,audioModelName:oe,imageModelName:q,videoModelName:o,textModelName:v,showWorkZoneCard:E}),Fe=n.openSettings&&As!==Ss,Os=s=>{Z(s),N&&(s==="providers"&&ce("catalog"),s==="presets"&&ge("catalog"))},Ds=s=>{Y(s),N&&ce("detail")},Rs=s=>{K(s),N&&ge("detail")},ks=()=>{try{return localStorage.getItem(Me.WORKZONE_CARD_VISIBLE)!=="false"}catch{return!0}},we=()=>{const s=de(Ne.get()),a=de(X.get()),r=X.getActivePresetId()||J,d=je.get(),l=ks();ne(s),Pe(Ce({profiles:s,presets:a,activePresetId:r,audioModelName:d.audioModelName||le(),imageModelName:d.imageModelName||ee(),videoModelName:d.videoModelName||se(),textModelName:d.textModelName||te(),showWorkZoneCard:l}))};u.useEffect(()=>{if(!n.openSettings)return;const s=de(Ne.get()),a=de(X.get()),r=X.getActivePresetId()||J,d=je.get();let l=!0;F(s),R(a),ne(s),T(r),Y(g=>{var h;return s.some(p=>p.id===g)?g:((h=s[0])==null?void 0:h.id)||O}),K(g=>{var h;return a.some(p=>p.id===g)?g:((h=a[0])==null?void 0:h.id)||J}),xe(d.audioModelName||le()),re(d.imageModelName||ee()),y(d.videoModelName||se()),C(d.textModelName||te());try{l=localStorage.getItem(Me.WORKZONE_CARD_VISIBLE)!=="false"}catch{l=!0}W(l),Z("providers"),ce("catalog"),ge("catalog"),Q(""),ye(!1),Pe(Ce({profiles:s,presets:a,activePresetId:r,audioModelName:d.audioModelName||le(),imageModelName:d.imageModelName||ee(),videoModelName:d.videoModelName||se(),textModelName:d.textModelName||te(),showWorkZoneCard:l}))},[n.openSettings]),u.useEffect(()=>{if(!U&&b[0]){Y(b[0].id);return}U&&b.length>0&&!b.some(s=>s.id===U)&&Y(b[0].id)},[b,U]),u.useEffect(()=>{if(!$&&S[0]){K(S[0].id);return}$&&S.length>0&&!S.some(s=>s.id===$)&&K(S[0].id)},[S,$]),u.useEffect(()=>{Q("")},[U,k]);const me=(s,a)=>{F(r=>r.map(d=>d.id===s?a(d):d))},Ts=(s,a)=>{R(r=>r.map(d=>d.id===s?a(d):d))},We=async(s,a)=>{var r,d;try{const l=je.get(),g=((r=s.find(c=>c.id===a))==null?void 0:r.id)||((d=s[0])==null?void 0:d.id)||J,h=s.find(c=>c.id===g)||s[0]||null,p=z(h==null?void 0:h.audio)||l.audioModelName||le(),j=z(h==null?void 0:h.image)||l.imageModelName||ee(),P=z(h==null?void 0:h.video)||l.videoModelName||se(),M=z(h==null?void 0:h.text)||l.textModelName||l.chatModel||te();return await X.update(de(s)),await X.setActivePresetId(g),await je.update({audioModelName:p,imageModelName:j,videoModelName:P,textModelName:M,chatModel:M}),R(s),T(g),xe(p),re(j),y(P),C(M),we(),!0}catch(l){return console.error("Failed to persist preset configuration:",l),V.error("预设保存失败,请重试"),!1}},Ls=async(s,a)=>{if(F(r=>r.map(d=>d.id===s?{...d,enabled:a}:d)),!!pe.some(r=>r.id===s))try{await Ne.update(de(Ne.get()).map(r=>r.id===s?{...r,enabled:a}:r)),we()}catch(r){console.error("Failed to persist provider enabled state:",r),F(d=>d.map(l=>l.id===s?{...l,enabled:!a}:l)),V.error("供应商状态保存失败,请重试")}},Vs=async s=>{W(s);try{localStorage.setItem(Me.WORKZONE_CARD_VISIBLE,String(s)),window.dispatchEvent(new CustomEvent("workzone-visibility-changed")),we()}catch(a){console.error("Failed to persist canvas visibility state:",a),W(!s),V.error("画布显示配置保存失败,请重试")}},Ze=()=>{const s=zt(b.length+1);F(a=>[...a,s]),Y(s.id),Z("providers"),N&&ce("detail")},zs=s=>{var r;if(us(s))return;const a=b.filter(d=>d.id!==s);F(a),R(d=>d.map(l=>Bt(l,s))),U===s&&Y(((r=a[0])==null?void 0:r.id)||O),N&&ce("catalog")},Ge=()=>{var r;const s=((r=ws[0])==null?void 0:r.id)||null,a=Ut(s,{audio:oe||le(),image:q||ee(),video:o||se(),text:v||te()});R(d=>[...d,a]),K(a.id),Z("presets"),N&&ge("detail")},Us=s=>{var r,d;if(S.length<=1)return;const a=S.filter(l=>l.id!==s);R(a),w===s&&T(((r=a[0])==null?void 0:r.id)||J),$===s&&K(((d=a[0])==null?void 0:d.id)||J),N&&ge("catalog")},$s=(s,a)=>{if(!I)return;const r=Ft(a),d=S.map(l=>l.id===I.id?$t(l,s,{defaultModelRef:r}):l);R(d),We(d,w)},Bs=async()=>{if(!_){V.warning("请先选择供应商配置");return}if(Fe){const r=V.loading("正在保存当前配置...",0),d=await Ye(!1);if(V.close(r),!d)return}const s=_.apiKey.trim(),a=ke(_.baseUrl.trim()||Se);if(!s){V.warning("请先填写 API Key");return}try{await ve.discover(_.id,a,s),ye(!0)}catch(r){const d=r instanceof Error?r.message:"模型同步失败";ve.setError(_.id,d),V.error({content:d,duration:3600})}},Ks=s=>{var r,d,l;if(!_)return;const a=ve.applySelection(_.id,s);if(_.id===O){const g=a.filter(c=>c.type==="image"),h=a.filter(c=>c.type==="video"),p=a.filter(c=>c.type==="text"),j=B.discoveredModels.filter(c=>c.type==="image").map(c=>c.id),P=B.discoveredModels.filter(c=>c.type==="video").map(c=>c.id),M=B.discoveredModels.filter(c=>c.type==="text").map(c=>c.id);!g.some(c=>c.id===q)&&j.includes(q)&&re(((r=g[0])==null?void 0:r.id)||ee()),!h.some(c=>c.id===o)&&P.includes(o)&&y(((d=h[0])==null?void 0:d.id)||se()),!p.some(c=>c.id===v)&&M.includes(v)&&C(((l=p[0])==null?void 0:l.id)||te())}V.success(a.length>0?`已为 ${_.name} 添加 ${a.length} 个模型`:`已清空 ${_.name} 的已添加模型`),ye(!1)},He=()=>{i(s=>({...s,openSettings:!1}))},Ye=async(s=!1)=>{var a,r,d,l,g,h;if(ze)return!1;Ue(!0);try{const p=b.map(f=>{var he;const ue=f.baseUrl.trim()?ke(f.baseUrl):"";return{...f,name:f.name.trim()||"未命名供应商",iconUrl:((he=f.iconUrl)==null?void 0:he.trim())||void 0,baseUrl:ue,apiKey:f.apiKey.trim()}}),j=new Set(p.map(f=>f.id)),P=S.map(f=>{const ue={...f,name:f.name.trim()||"未命名预设",audio:{...f.audio},image:{...f.image},video:{...f.video},text:{...f.text}};return["image","video","audio","text"].forEach(he=>{const ss=ue[he],Re=fe(ss),ts=z(ss);if(Re&&!j.has(Re)){ue[he]=ie(ae(null,ts));return}ue[he]=ie(ae(Re,ts))}),ue}),M=((a=P.find(f=>f.id===w))==null?void 0:a.id)||((r=P[0])==null?void 0:r.id)||J,c=P.find(f=>f.id===M)||P[0]||null,A=p.find(f=>f.id===O)||p[0],G=ke((A==null?void 0:A.baseUrl)||Se),H=oe.trim()||((d=Is[0])==null?void 0:d.id)||le(),_e=q.trim()||((l=$e[0])==null?void 0:l.id)||ee(),Oe=o.trim()||((g=Be[0])==null?void 0:g.id)||se(),De=v.trim()||((h=Ke[0])==null?void 0:h.id)||te(),Js=z(c==null?void 0:c.image)||_e,qs=z(c==null?void 0:c.video)||Oe,Xs=z(c==null?void 0:c.audio)||H,et=z(c==null?void 0:c.text)||De;p.forEach(f=>{ve.invalidateIfConfigChanged(f.id,f.baseUrl||Se,f.apiKey||"")}),await je.update({apiKey:(A==null?void 0:A.apiKey)||"",baseUrl:G,audioModelName:Xs,imageModelName:Js,videoModelName:qs,textModelName:et}),await Ne.update(p),await mt.update(ve.getCatalogs().filter(f=>j.has(f.profileId))),await X.update(P),await X.setActivePresetId(M);try{localStorage.setItem(Me.WORKZONE_CARD_VISIBLE,String(E)),window.dispatchEvent(new CustomEvent("workzone-visibility-changed"))}catch{}return F(p),ne(de(p)),R(P),T(M),xe(H),re(_e),y(Oe),C(De),Pe(Ce({profiles:p,presets:P,activePresetId:M,audioModelName:H,imageModelName:_e,videoModelName:Oe,textModelName:De,showWorkZoneCard:E})),s&&He(),!0}catch(p){return console.error("Failed to persist settings drafts:",p),V.error("设置保存失败,请稍后重试"),!1}finally{Ue(!1)}},Fs=()=>{if(!Fe){He();return}(async()=>{const s=V.loading("正在保存设置...",0),a=await Ye(!0);V.close(s),a||V.warning("设置尚未保存,请检查后重试")})()},Ws=()=>{Ve||ze||Fs()},Qe=()=>e.jsxs("div",{className:"settings-dialog__sidebar-shell settings-dialog__sidebar-shell--catalog",children:[e.jsxs("div",{className:"settings-dialog__sidebar-summary",children:[e.jsxs("div",{className:"settings-dialog__sidebar-summary-row",children:[e.jsx("span",{className:"settings-dialog__sidebar-summary-title",children:"供应商目录"}),N?e.jsx("button",{type:"button",className:"settings-dialog__sidebar-summary-action",onClick:Ze,children:"新增供应商"}):null]}),N?e.jsx("span",{className:"settings-dialog__sidebar-summary-text",children:"先从列表里选择供应商,再进入对应的配置页面。"}):null]}),e.jsx("div",{className:"settings-dialog__sidebar-list",children:b.map(s=>{const a=s.id===(_==null?void 0:_.id);return e.jsxs("div",{className:`settings-dialog__provider-row ${a?"settings-dialog__provider-row--active":""} ${s.enabled?"":"settings-dialog__provider-row--disabled"}`,children:[e.jsxs("button",{type:"button",className:"settings-dialog__provider-select",onClick:()=>Ds(s.id),"aria-pressed":a,children:[e.jsxs("span",{className:"settings-dialog__provider-select-main",children:[e.jsx(hs,{profile:s}),e.jsxs("span",{className:"settings-dialog__provider-copy",children:[e.jsxs("span",{className:"settings-dialog__provider-name-row",children:[e.jsx("span",{className:"settings-dialog__provider-name",children:s.name}),s.id===O?e.jsx("span",{className:"settings-dialog__provider-tag",children:"默认"}):null]}),N?e.jsxs("span",{className:"settings-dialog__provider-meta",children:[e.jsx("span",{children:Te[s.providerType].label}),e.jsx("span",{children:s.enabled?"启用":"停用"})]}):null]})]}),N?e.jsx(ns,{size:16,className:"settings-dialog__provider-arrow","aria-hidden":"true"}):null]}),e.jsxs("div",{className:"settings-dialog__provider-switch",children:[e.jsx("span",{className:"settings-dialog__provider-switch-copy",children:s.enabled?"启用":"停用"}),e.jsx(is,{size:"small",value:s.enabled,disabled:s.id===O,onChange:r=>void Ls(s.id,r)})]})]},s.id)})}),N?null:e.jsxs("button",{type:"button",className:"settings-dialog__sidebar-add",onClick:Ze,children:[e.jsx("span",{className:"settings-dialog__sidebar-add-icon",children:"+"}),e.jsx("span",{children:"新增供应商"})]})]}),Je=()=>e.jsxs("div",{className:"settings-dialog__sidebar-shell",children:[e.jsxs("div",{className:"settings-dialog__sidebar-summary",children:[e.jsxs("div",{className:"settings-dialog__sidebar-summary-row",children:[e.jsx("span",{className:"settings-dialog__sidebar-summary-title",children:"默认模型"}),N?e.jsx("button",{type:"button",className:"settings-dialog__sidebar-summary-action",onClick:Ge,children:"新增预设"}):null]}),N?e.jsx("span",{className:"settings-dialog__sidebar-summary-text",children:"先选中一个预设,再进入详情页调整默认路由。"}):null]}),e.jsx("div",{className:"settings-dialog__sidebar-list",children:S.map(s=>{const a=s.id===(I==null?void 0:I.id),r=s.id===w,d=_s(s);return e.jsxs("button",{type:"button",className:`settings-dialog__sidebar-item ${a?"settings-dialog__sidebar-item--active":""}`,onClick:()=>Rs(s.id),children:[e.jsxs("div",{className:"settings-dialog__sidebar-item-head",children:[e.jsxs("div",{className:"settings-dialog__sidebar-item-top",children:[e.jsx("span",{children:s.name}),r?e.jsx("span",{className:"settings-dialog__sidebar-badge settings-dialog__sidebar-badge--accent",children:"当前"}):null]}),N?e.jsx(ns,{size:16,className:"settings-dialog__sidebar-item-arrow","aria-hidden":"true"}):null]}),e.jsxs("div",{className:"settings-dialog__sidebar-item-meta",children:[e.jsxs("span",{children:[d,"/3 已配置"]}),N?e.jsx("span",{children:r?"正在生效":"点击查看详情"}):null]})]},s.id)})}),N?null:e.jsxs("button",{type:"button",className:"settings-dialog__sidebar-add",onClick:Ge,children:[e.jsx("span",{className:"settings-dialog__sidebar-add-icon",children:"+"}),e.jsx("span",{children:"新增预设"})]})]}),qe=(s,a)=>e.jsx("div",{className:"settings-dialog__workspace settings-dialog__workspace--single",children:e.jsx("div",{className:"settings-dialog__content-panel settings-dialog__content-panel--compact",children:e.jsx("div",{className:"settings-dialog__mobile-stage",children:a},s)})}),Xe=(s=!1)=>{if(!_)return e.jsx("div",{className:"settings-dialog__empty-panel",children:"请选择一个供应商。"});const a=ms(B.models),r=kt(_,pe),d=a.image+a.video+a.text;return e.jsxs("div",{className:`settings-dialog__content-panel settings-dialog__content-panel--providers ${s?"settings-dialog__content-panel--detail":""}`,children:[s?e.jsxs("div",{className:"settings-dialog__compact-stage-header",children:[e.jsxs("button",{type:"button",className:"settings-dialog__compact-back",onClick:()=>ce("catalog"),children:[e.jsx(as,{size:16}),e.jsx("span",{children:"返回供应商目录"})]}),e.jsxs("div",{className:"settings-dialog__compact-stage-copy",children:[e.jsx("span",{className:"settings-dialog__compact-stage-eyebrow",children:"供应商配置"}),e.jsx("p",{className:"settings-dialog__compact-stage-text",children:"进入详情后再编辑接口信息、密钥和模型同步配置。"})]})]}):null,e.jsx("div",{className:"settings-dialog__section settings-dialog__section--compact",children:e.jsxs("div",{className:"settings-dialog__panel-header",children:[e.jsxs("div",{className:"settings-dialog__profile-hero",children:[e.jsx(hs,{profile:_,size:"large"}),e.jsxs("div",{children:[e.jsx("h3",{className:"settings-dialog__section-title",children:_.name}),e.jsxs("div",{className:"settings-dialog__inline-meta",children:[e.jsx("span",{children:Te[_.providerType].label}),e.jsx("span",{children:_.enabled?"启用":"停用"}),e.jsxs("span",{children:[d," 个模型"]}),e.jsx("span",{children:r==="saved"?"已保存":"未保存"})]})]})]}),us(_.id)?null:e.jsx("button",{type:"button",className:"settings-dialog__danger-button",onClick:()=>zs(_.id),children:"删除"})]})}),e.jsxs("div",{className:"settings-dialog__section",children:[e.jsx("div",{className:"settings-dialog__section-header",children:e.jsx("div",{children:e.jsx("h3",{className:"settings-dialog__section-title",children:"基础配置"})})}),e.jsxs("div",{className:"settings-dialog__grid",children:[e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column",children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"名称"}),e.jsx("input",{type:"text",className:"settings-dialog__input",value:_.name,onChange:l=>me(_.id,g=>({...g,name:l.target.value}))})]}),e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column",children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"接口类型"}),e.jsx("select",{className:"settings-dialog__select",value:_.providerType,onChange:l=>me(_.id,g=>{const h=l.target.value,p=Le(g.providerType),j=Le();return{...g,providerType:h,authType:g.authType===p?j:g.authType}}),children:Pt.map(l=>e.jsx("option",{value:l,children:Te[l].label},l))})]}),e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column settings-dialog__field--full",children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"图标 URL"}),e.jsx("input",{type:"url",className:"settings-dialog__input",value:_.iconUrl||"",onChange:l=>me(_.id,g=>({...g,iconUrl:l.target.value})),placeholder:"可选,留空时自动生成默认图标"}),e.jsx("span",{className:"settings-dialog__field-hint",children:"支持填写远程图片地址;未填写时将根据供应商名称生成默认图标。"})]}),e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column settings-dialog__field--full",children:[e.jsxs("div",{className:"settings-dialog__label-with-tooltip settings-dialog__label-with-tooltip--left",children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"API Key"}),e.jsx(gt,{content:e.jsxs("div",{children:["您可以从以下地址获取 API Key:",e.jsx("br",{}),e.jsx("a",{href:"https://api.tu-zi.com/token",target:"_blank",rel:"noopener noreferrer",style:{color:"#F39C12",textDecoration:"none"},children:"api.tu-zi.com/token"})]}),placement:"top",theme:"light",showArrow:!1,children:e.jsx(bs,{className:"settings-dialog__tooltip-icon"})})]}),e.jsx("input",{type:"password",className:"settings-dialog__input",value:_.apiKey,onChange:l=>me(_.id,g=>({...g,apiKey:l.target.value})),autoComplete:"off"})]}),e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column settings-dialog__field--full",children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"API 地址"}),e.jsx("input",{type:"text",className:"settings-dialog__input",value:_.baseUrl,onChange:l=>me(_.id,g=>({...g,baseUrl:l.target.value})),placeholder:Se})]}),e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column",children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"鉴权方式"}),e.jsx("select",{className:"settings-dialog__select",value:_.authType,onChange:l=>me(_.id,g=>({...g,authType:l.target.value})),children:It.map(l=>e.jsx("option",{value:l,children:Dt[l].label},l))})]})]})]}),_.id===O?e.jsx("div",{className:"settings-dialog__section settings-dialog__section--compact",children:e.jsxs("div",{className:"settings-dialog__compat-card",children:[e.jsx("div",{className:"settings-dialog__compat-title",children:"兼容默认模型"}),e.jsxs("div",{className:"settings-dialog__compat-meta",children:[e.jsxs("span",{children:["图片:",q||ee()]}),e.jsxs("span",{children:["视频:",o||se()]}),e.jsxs("span",{children:["音频:",oe||le()]}),e.jsxs("span",{children:["文本:",v||te()]})]})]})}):null,Zs()]},s?`provider-detail-${_.id}`:void 0)},Zs=()=>{const a=(_==null?void 0:_.id)===O?[..._t,...B.models]:B.models,r=new Map(ys.map((c,A)=>[c,A])),d=Ps.trim(),l=ms(a),g=a.filter(c=>Rt(c,d)),h=Ot.map(c=>({type:c,models:g.filter(A=>A.type===c).sort((A,G)=>{const H=r.get(A.vendor)??Number.MAX_SAFE_INTEGER,_e=r.get(G.vendor)??Number.MAX_SAFE_INTEGER;return H!==_e?H-_e:A.id.localeCompare(G.id,"zh-Hans-CN")})})).filter(c=>c.models.length>0),p=Ie||a.length>0,j=a.length>0&&g.length===0&&!!d,P=B.status==="error"&&a.length===0,M=!Ie&&a.length===0;return e.jsxs("div",{className:"settings-dialog__section",children:[e.jsx("div",{className:"settings-dialog__section-header",children:e.jsxs("div",{children:[e.jsx("h3",{className:"settings-dialog__section-title",children:"模型"}),e.jsxs("div",{className:"settings-dialog__inline-meta",children:[e.jsxs("span",{children:["已添加 ",a.length," 个"]}),e.jsxs("span",{children:["图 ",l.image]}),e.jsxs("span",{children:["视 ",l.video]}),e.jsxs("span",{children:["音 ",l.audio]}),e.jsxs("span",{children:["文 ",l.text]})]})]})}),p?e.jsxs("div",{className:"settings-dialog__model-toolbar",children:[e.jsxs("label",{className:`settings-dialog__model-search ${a.length===0?"settings-dialog__model-search--disabled":""}`,children:[e.jsx(Ns,{size:15}),e.jsx("input",{type:"text",value:L,onChange:c=>Q(c.target.value),placeholder:a.length>0?"搜索模型 ID、名称或品牌":"获取模型后可搜索",disabled:a.length===0}),L?e.jsx("button",{type:"button",className:"settings-dialog__model-search-clear",onClick:()=>Q(""),"aria-label":"清空搜索",children:e.jsx(xs,{size:14})}):null]}),e.jsx("button",{type:"button",className:"settings-dialog__button settings-dialog__button--fetch",onClick:Bs,disabled:!Ie||B.status==="loading",children:B.status==="loading"?e.jsxs(e.Fragment,{children:[e.jsx(pt,{size:15,className:"settings-dialog__button-spinner"}),"同步中"]}):"获取模型"})]}):null,h.length>0?e.jsx("div",{className:"settings-dialog__model-type-groups",children:h.map(({type:c,models:A})=>e.jsxs("div",{className:"settings-dialog__model-type-group",children:[e.jsxs("div",{className:"settings-dialog__model-type-header",children:[e.jsx("span",{className:"settings-dialog__model-type-title",children:At[c]}),e.jsx("span",{className:"settings-dialog__model-type-count",children:A.length})]}),e.jsx("div",{className:"settings-dialog__model-type-list",children:A.map(G=>{const H=js(G.vendor);return e.jsxs("div",{className:"settings-dialog__model-type-item",style:{"--model-brand-accent":H.accent,"--model-brand-surface":H.surface,"--model-brand-border":H.border},children:[e.jsx("span",{className:"settings-dialog__model-type-item-logo",children:e.jsx(fs,{vendor:G.vendor,size:16})}),e.jsxs("div",{className:"settings-dialog__model-type-item-copy",children:[e.jsx("span",{className:"settings-dialog__model-type-item-id",children:G.id}),e.jsx("span",{className:"settings-dialog__model-type-item-vendor",children:Ee(G.vendor)})]})]},G.id)})})]},c))}):j?e.jsx("div",{className:"settings-dialog__model-empty",children:"没有匹配的模型,试试搜索品牌名或更完整的模型 ID。"}):P?e.jsxs("div",{className:"settings-dialog__model-empty settings-dialog__model-empty--error",children:[e.jsx(Nt,{size:16}),e.jsx("span",{children:B.error||"模型获取失败,请稍后重试"})]}):M?e.jsx("div",{className:"settings-dialog__model-empty",children:"填写 API Key 后即可获取模型,获取完成后可在这里检索和浏览。"}):e.jsx("div",{className:"settings-dialog__model-empty",children:"还没有已添加的模型"})]})},Gs=(s,a,r)=>{const d=fe(r),l=z(r);return b.filter(g=>g.id===d||g.enabled&&g.capabilities[a]).map(g=>{const p=(g.id===O?s==="image"?$e:s==="video"?Be:Ke:ve.getState(g.id).models.filter(j=>j.type===s)).filter((j,P,M)=>M.findIndex(c=>c.id===j.id)===P);return g.id===d&&l&&!p.some(j=>j.id===l)&&p.unshift({id:l,label:l,shortLabel:l,type:s,vendor:ht.OTHER}),{profile:g,models:p}}).filter(g=>g.models.length>0)},Ae=(s,a,r)=>{var p;const d=Gs(s,r,a),l=fe(a),g=z(a),h=((p=b.find(j=>j.id===l))==null?void 0:p.name)||"未配置";return e.jsxs("div",{className:`settings-dialog__route-card settings-dialog__route-card--${s}`,children:[e.jsx("div",{className:"settings-dialog__route-card-top",children:e.jsx("div",{className:"settings-dialog__route-card-title",children:wt[s]})}),e.jsxs("div",{className:"settings-dialog__stack",children:[e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column",children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"默认模型"}),e.jsxs("select",{className:"settings-dialog__select",value:l&&g?vs(l,g):"",onChange:j=>$s(s,j.target.value),children:[e.jsx("option",{value:"",children:"未配置"}),d.map(({profile:j,models:P})=>e.jsx("optgroup",{label:`${j.name}${j.enabled?"":"(已停用)"}`,children:P.map(M=>e.jsx("option",{value:vs(j.id,M.id),children:M.shortLabel||M.label},`${j.id}-${M.id}`))},j.id))]})]}),e.jsxs("div",{className:"settings-dialog__route-meta",children:[e.jsx("span",{children:h}),e.jsx("span",{children:g||"未选择模型"}),d.length===0?e.jsx("span",{children:"暂无可选模型"}):null]})]})]})},es=(s=!1)=>{if(!I)return e.jsx("div",{className:"settings-dialog__empty-panel",children:"请选择一个默认模型预设。"});const a=_s(I),r=I.id===w;return e.jsxs("div",{className:`settings-dialog__content-panel ${s?"settings-dialog__content-panel--detail":""}`,children:[s?e.jsxs("div",{className:"settings-dialog__compact-stage-header",children:[e.jsxs("button",{type:"button",className:"settings-dialog__compact-back",onClick:()=>ge("catalog"),children:[e.jsx(as,{size:16}),e.jsx("span",{children:"返回模型预设"})]}),e.jsxs("div",{className:"settings-dialog__compact-stage-copy",children:[e.jsx("span",{className:"settings-dialog__compact-stage-eyebrow",children:"模型预设"}),e.jsx("p",{className:"settings-dialog__compact-stage-text",children:"在这里设置图片、视频和文本模型的默认路由。"})]})]}):null,e.jsxs("div",{className:"settings-dialog__section",children:[e.jsxs("div",{className:"settings-dialog__panel-header",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"settings-dialog__section-title",children:I.name}),e.jsxs("div",{className:"settings-dialog__inline-meta",children:[e.jsx("span",{children:r?"当前预设":"未激活"}),e.jsxs("span",{children:[a,"/3 已配置"]})]})]}),e.jsxs("div",{className:"settings-dialog__inline-row",children:[e.jsx("button",{type:"button",className:"settings-dialog__ghost-button",onClick:()=>{We(S,I.id)},children:"设为当前预设"}),e.jsx("button",{type:"button",className:"settings-dialog__danger-button",onClick:()=>Us(I.id),disabled:S.length<=1,children:"删除预设"})]})]}),e.jsx("div",{className:"settings-dialog__grid",children:e.jsxs("div",{className:"settings-dialog__field settings-dialog__field--column settings-dialog__field--full",children:[e.jsx("label",{className:"settings-dialog__label settings-dialog__label--stacked",children:"预设名称"}),e.jsx("input",{type:"text",className:"settings-dialog__input",value:I.name,onChange:d=>Ts(I.id,l=>({...l,name:d.target.value}))})]})})]}),e.jsxs("div",{className:"settings-dialog__routes",children:[Ae("image",I.image,"supportsImage"),Ae("video",I.video,"supportsVideo"),Ae("text",I.text,"supportsText")]})]},s?`preset-detail-${I.id}`:void 0)},Hs=()=>e.jsx("div",{className:"settings-dialog__workspace settings-dialog__workspace--single",children:e.jsxs("div",{className:"settings-dialog__content-panel settings-dialog__content-panel--canvas",children:[N?e.jsx("div",{className:"settings-dialog__compact-stage-header",children:e.jsxs("div",{className:"settings-dialog__compact-stage-copy",children:[e.jsx("span",{className:"settings-dialog__compact-stage-eyebrow",children:"画布显示"}),e.jsx("p",{className:"settings-dialog__compact-stage-text",children:"手机上会以更集中的卡片形式展示,方便快速切换画布相关开关。"})]})}):null,e.jsxs("div",{className:"settings-dialog__section settings-dialog__section--canvas-card",children:[e.jsx("div",{className:"settings-dialog__section-header",children:e.jsx("div",{children:e.jsx("h3",{className:"settings-dialog__section-title",children:"画布显示配置"})})}),e.jsxs("div",{className:"settings-dialog__preference settings-dialog__preference--panel",children:[e.jsxs("div",{className:"settings-dialog__toggle-copy",children:[e.jsx("span",{className:"settings-dialog__toggle-title",children:"任务进度卡片"}),e.jsx("span",{className:"settings-dialog__toggle-desc",children:"在画布中显示任务进度卡片,便于追踪当前生成状态。"})]}),e.jsx(is,{size:"small",value:E,onChange:s=>void Vs(s)})]})]})]})}),Ys=()=>e.jsx("aside",{className:"settings-dialog__nav",children:e.jsx("div",{className:"settings-dialog__nav-shell",children:e.jsx("div",{className:"settings-dialog__nav-list",children:Et.map(s=>e.jsx("button",{type:"button",className:`settings-dialog__nav-item ${k===s.value?"settings-dialog__nav-item--active":""}`,onClick:()=>Os(s.value),children:e.jsx("span",{className:"settings-dialog__nav-item-title",children:s.label})},s.value))})})}),Qs=()=>k==="canvas"?Hs():k==="presets"?N?Es==="catalog"?qe("presets-catalog",Je()):es(!0):e.jsxs("div",{className:"settings-dialog__workspace",children:[e.jsx("aside",{className:"settings-dialog__sidebar",children:Je()}),es()]}):N?Cs==="catalog"?qe("providers-catalog",Qe()):Xe(!0):e.jsxs("div",{className:"settings-dialog__workspace",children:[e.jsx("aside",{className:"settings-dialog__sidebar",children:Qe()}),Xe()]});return e.jsxs(e.Fragment,{children:[e.jsx(ct,{visible:n.openSettings,title:"设置",onClose:Ws,width:N?"100%":"88%",height:N?"100%":"88%",minWidth:N?Math.max(320,Math.min(x-16,640)):1080,minHeight:N?Math.max(520,Math.min(D-16,820)):680,x:"center",y:"center",maximizable:!0,minimizable:!1,resizable:!N,movable:!N,modal:!1,className:"winbox-ai-generation winbox-tool-window winbox-settings-window",container:t,background:"#ffffff",autoMaximize:N,children:e.jsx("div",{className:"settings-dialog","data-testid":"settings-dialog",children:e.jsxs("div",{className:"settings-dialog__layout",children:[Ys(),e.jsx("div",{className:"settings-dialog__main",children:Qs()})]})})}),e.jsx(Ct,{open:Ve,container:t,models:B.discoveredModels,selectedModelIds:B.selectedModelIds,onClose:()=>ye(!1),onConfirm:Ks})]})};export{Yt as IMAGE_MODEL_GROUPED_OPTIONS,Zt as SettingsDialog,Qt as VIDEO_MODEL_OPTIONS};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a6 as M,a7 as u,a8 as D,a9 as m,aa as y,ab as b,ac as T,ad as N,ae as j,af as $,ag as R,ah as F,ai as E,aj as S,ak as U,al as k,am as x,an as O,u as z,ao as _,ap as B,aq as L,ar as A,as as H}from"./index-7WzIC7_D.js";const v="github_sync_master_index",C="github_sync_master_gist_id";class J{constructor(){this.masterIndex=null,this.masterGistId=null,this.initialized=!1}async initialize(){this.initialized||(this.masterIndex=await M.get(v),this.masterGistId=await M.get(C),this.initialized=!0,u("ShardRouter initialized",{hasMasterIndex:!!this.masterIndex,masterGistId:this.masterGistId?D(this.masterGistId):null,shardCount:this.masterIndex?Object.keys(this.masterIndex.shards).length:0}))}getMasterIndex(){return this.masterIndex}getMasterGistId(){return this.masterGistId}async setMasterGistId(s){this.masterGistId=s,await M.set(C,s)}isConfigured(){return!!this.masterIndex&&!!this.masterGistId}async loadMasterIndexFromRemote(){if(!this.masterGistId)return u("No master gist ID configured"),null;try{const s=await m.getGistFileContent(y.MASTER_INDEX,this.masterGistId);if(!s)return u("No master index found in remote"),null;const t=JSON.parse(s);return this.masterIndex=t,await this.saveMasterIndexLocally(),u("Loaded master index from remote",{shards:Object.keys(t.shards).length,files:Object.keys(t.fileIndex).length}),t}catch(s){return b("Failed to load master index",s instanceof Error?s:new Error(String(s))),null}}async saveMasterIndexLocally(){this.masterIndex&&await M.set(v,this.masterIndex)}async saveMasterIndexToRemote(){if(!this.masterIndex||!this.masterGistId)throw new Error("Master index or gist ID not configured");T(this.masterIndex),await m.updateGistFiles({[y.MASTER_INDEX]:JSON.stringify(this.masterIndex,null,2)},this.masterGistId),await this.saveMasterIndexLocally(),u("Saved master index to remote")}async initializeMasterIndex(s){if(this.masterIndex)return this.masterIndex;if(this.masterIndex=N(s),!this.masterGistId)throw new Error("Master gist ID must be set before initializing index");return await this.saveMasterIndexLocally(),u("Initialized new master index"),this.masterIndex}getShardForFile(s){if(!this.masterIndex)return null;const t=this.masterIndex.fileIndex[s];return t&&this.masterIndex.shards[t.shardId]||null}getFileIndexEntry(s){return this.masterIndex&&this.masterIndex.fileIndex[s]||null}isFileSynced(s){return this.getFileIndexEntry(s)!==null}findActiveShard(s){if(!this.masterIndex)return null;const t=Object.values(this.masterIndex.shards).filter(e=>e.status==="active").sort((e,a)=>a.fileCount-e.fileCount);for(const e of t)if(j(e,s))return e;return null}async createShard(s){if(!this.masterIndex||!this.masterGistId)throw new Error("Master index not initialized");const t=Object.keys(this.masterIndex.shards).length+1,e=s||$(t);if(this.masterIndex.shards[e])throw new Error(`Shard alias "${e}" already exists`);const a=`${k.SHARD} #${t} (${e})`,r=R(e,this.masterGistId),i=await F.getPassword(),o=JSON.stringify(r,null,2),n=await E.encrypt(o,this.masterGistId,i||void 0),d=await m.createSyncGist({[y.SHARD_MANIFEST]:n});try{await m.updateGistFiles({[y.SHARD_MANIFEST]:n},d.id)}catch(h){S("Failed to update shard description",{error:String(h)})}const c=U(d.id,e,t);return c.description=a,this.masterIndex.shards[e]=c,T(this.masterIndex),u("Created new shard",{alias:e,gistId:D(d.id),order:t}),c}async allocateFile(s){if(!this.masterIndex)throw new Error("Master index not initialized");const t=this.findActiveShard(s);return t?{shard:t,isNewShard:!1}:{shard:await this.createShard(),isNewShard:!0}}async allocateFiles(s){if(!this.masterIndex)throw new Error("Master index not initialized");const t=new Map,e=[];let a=null,r=0,i=0;const o=Object.values(this.masterIndex.shards).filter(n=>n.status==="active").sort((n,d)=>d.fileCount-n.fileCount);o.length>0&&(a=o[0],r=a.fileCount,i=a.totalSize);for(const n of s){const d=this.masterIndex.fileIndex[n.url];if(d){const h=this.masterIndex.shards[d.shardId];if(h){t.set(n.url,h);continue}}if(!a||r>=x.FILE_LIMIT||i+n.size>x.SIZE_LIMIT){const h=await this.createShard();e.push(h),a=h,r=0,i=0}t.set(n.url,a),r++,i+=n.size}return u("Batch allocation completed",{totalFiles:s.length,newShardsCreated:e.length}),{allocations:t,newShards:e}}registerFile(s,t,e,a,r){if(!this.masterIndex)throw new Error("Master index not initialized");const i={shardId:t,filename:e,size:a,type:r,syncedAt:Date.now()};this.masterIndex.fileIndex[s]=i;const o=this.masterIndex.shards[t];o&&(o.fileCount++,o.totalSize+=a,o.updatedAt=Date.now(),o.fileCount>=x.FILE_LIMIT&&(o.status="full",u("Shard is now full",{shardId:t})))}unregisterFile(s){if(!this.masterIndex)return null;const t=this.masterIndex.fileIndex[s];if(!t)return null;delete this.masterIndex.fileIndex[s];const e=this.masterIndex.shards[t.shardId];return e&&(e.fileCount=Math.max(0,e.fileCount-1),e.totalSize=Math.max(0,e.totalSize-t.size),e.updatedAt=Date.now(),e.status==="full"&&e.fileCount<x.FILE_LIMIT&&(e.status="active",u("Shard reactivated",{shardId:t.shardId}))),t}getShard(s){return this.masterIndex&&this.masterIndex.shards[s]||null}getAllShards(){return this.masterIndex?Object.values(this.masterIndex.shards):[]}async updateShardAlias(s,t){if(!this.masterIndex)throw new Error("Master index not initialized");const e=this.masterIndex.shards[s];if(!e)throw new Error(`Shard "${s}" not found`);if(s!==t&&this.masterIndex.shards[t])throw new Error(`Alias "${t}" already exists`);for(const a of Object.keys(this.masterIndex.fileIndex)){const r=this.masterIndex.fileIndex[a];r.shardId===s&&(r.shardId=t)}for(const a of this.masterIndex.tombstones)a.shardId===s&&(a.shardId=t);delete this.masterIndex.shards[s],e.alias=t,e.description=`${k.SHARD} #${e.order} (${t})`,e.updatedAt=Date.now(),this.masterIndex.shards[t]=e,u("Updated shard alias",{old:s,new:t})}archiveShard(s){if(!this.masterIndex)throw new Error("Master index not initialized");const t=this.masterIndex.shards[s];if(!t)throw new Error(`Shard "${s}" not found`);t.status="archived",t.updatedAt=Date.now(),u("Archived shard",{shardId:s})}reactivateShard(s){if(!this.masterIndex)throw new Error("Master index not initialized");const t=this.masterIndex.shards[s];if(!t)throw new Error(`Shard "${s}" not found`);t.fileCount>=x.FILE_LIMIT?t.status="full":t.status="active",t.updatedAt=Date.now(),u("Reactivated shard",{shardId:s})}getStats(){if(!this.masterIndex)return{totalShards:0,activeShards:0,fullShards:0,archivedShards:0,totalFiles:0,totalSize:0};const s=Object.values(this.masterIndex.shards);return{totalShards:s.length,activeShards:s.filter(t=>t.status==="active").length,fullShards:s.filter(t=>t.status==="full").length,archivedShards:s.filter(t=>t.status==="archived").length,totalFiles:Object.keys(this.masterIndex.fileIndex).length,totalSize:s.reduce((t,e)=>t+e.totalSize,0)}}async clearLocalCache(){this.masterIndex=null,this.masterGistId=null,this.initialized=!1,await M.remove(v),await M.remove(C),u("Cleared local cache")}destroy(){this.masterIndex=null,this.masterGistId=null,this.initialized=!1}}const l=new J;function G(){return localStorage.getItem(H)||"unknown"}function X(p){return p<1024?`${p} B`:p<1024*1024?`${(p/1024).toFixed(1)} KB`:`${(p/1024/1024).toFixed(1)} MB`}async function Y(p){return new Promise((s,t)=>{const e=new FileReader;e.onloadend=()=>{const r=e.result.split(",")[1];s(r)},e.onerror=t,e.readAsDataURL(p)})}function K(p,s){const t=atob(p),e=new Uint8Array(t.length);for(let a=0;a<t.length;a++)e[a]=t.charCodeAt(a);return new Blob([e],{type:s})}class P{constructor(){this.syncingUrls=new Set}async uploadMedia(s,t){const e=Date.now(),a={success:!0,uploaded:0,downloaded:0,deleted:0,skipped:0,details:[]};if(await l.initialize(),!l.isConfigured())return a.success=!1,a.error="分片系统未配置",a;const r=s.filter(f=>this.syncingUrls.has(f.url)?(a.skipped++,a.details.push({url:f.url,action:"skip",success:!0,error:"正在同步中"}),!1):l.isFileSynced(f.url)?(a.skipped++,a.details.push({url:f.url,action:"skip",success:!0,error:"已同步"}),!1):!0);if(r.length===0)return a;const i=await this.getFileSizes(r),o=await l.allocateFiles(i),n=this.groupByShards(r,o.allocations),d=Object.keys(n);for(let f=0;f<d.length;f+=x.CONCURRENCY){const w=d.slice(f,f+x.CONCURRENCY);await Promise.all(w.map(I=>this.uploadToShard(I,n[I],a,t)))}await l.saveMasterIndexToRemote(),a.success=a.uploaded>0||a.skipped>0;const c=a.details.filter(f=>!f.success).length,h=Date.now()-e;return u("Upload completed",{uploaded:a.uploaded,skipped:a.skipped,failed:c,duration:h}),O("分片上传完成",{uploaded:a.uploaded,skipped:a.skipped,failed:c,duration:h}),a}async getFileSizes(s){const t=[];for(const e of s){let a=e.size||0;if(!a){const r=await z.getCachedBlob(e.url);a=(r==null?void 0:r.size)||0}t.push({url:e.url,size:a})}return t}groupByShards(s,t){const e={};for(const a of s){const r=t.get(a.url);r&&(e[r.alias]||(e[r.alias]=[]),e[r.alias].push(a))}return e}async uploadToShard(s,t,e,a){const r=l.getShard(s);if(!r){for(const n of t)e.details.push({url:n.url,action:"upload",success:!1,error:`分片 ${s} 不存在`});return}const i={},o=[];for(const n of t){this.syncingUrls.add(n.url);try{const d=await this.prepareMediaForUpload(n);if(d.success&&d.content){const c=`media_${_(n.url)}.json`;i[c]=d.content,o.push(n),l.registerFile(n.url,s,c,d.size,n.type),e.details.push({url:n.url,action:"upload",success:!0,shardId:s}),e.uploaded++,a==null||a(e.uploaded+e.skipped,e.uploaded+e.skipped+t.length,n.url,"uploading")}else e.details.push({url:n.url,action:"upload",success:!1,error:d.error||"准备上传失败"})}catch(d){b(`Failed to prepare: ${n.url}`,d instanceof Error?d:new Error(String(d))),e.details.push({url:n.url,action:"upload",success:!1,error:d instanceof Error?d.message:"上传失败"})}finally{this.syncingUrls.delete(n.url)}}if(Object.keys(i).length>0)try{const n=await this.getOrCreateShardManifest(r);for(const I of o){const g=`media_${_(I.url)}.json`;n.files[g]={url:I.url,type:I.type,size:I.size||0,mimeType:I.mimeType||"",syncedAt:Date.now(),syncedFromDevice:G()}}n.updatedAt=Date.now();const d=JSON.stringify(n,null,2),c=l.getMasterGistId();if(c){const I=await F.getPassword();i[y.SHARD_MANIFEST]=await E.encrypt(d,c,I||void 0)}else i[y.SHARD_MANIFEST]=d;const h=Object.values(i).reduce((I,g)=>I+g.length,0),f=Object.keys(i).length;u("Uploading to shard",{shardId:s,fileCount:f,totalSizeMB:(h/1024/1024).toFixed(2)});const w=8*1024*1024;h>w?(u("Total size exceeds limit, splitting into batches"),await this.uploadInBatches(i,r.gistId,w)):await m.updateGistFiles(i,r.gistId),u("Uploaded files to shard",{count:o.length,shardId:s})}catch(n){b(`Failed to update shard: ${s}`,n instanceof Error?n:new Error(String(n)));for(const d of o)l.unregisterFile(d.url);for(const d of o){const c=e.details.find(h=>h.url===d.url);c&&(c.success=!1,c.error="批量上传失败"),e.uploaded--}}}async uploadInBatches(s,t,e){const a=Object.entries(s);let r={},i=0,o=0;for(const[n,d]of a){const c=d.length;if(c>e){Object.keys(r).length>0&&(u("Uploading batch",{batch:o+1,fileCount:Object.keys(r).length}),await m.updateGistFiles(r,t),r={},i=0,o++),u("Uploading large file",{filename:n,sizeMB:(c/1024/1024).toFixed(2)}),await m.updateGistFiles({[n]:d},t),o++;continue}i+c>e&&Object.keys(r).length>0&&(u(`ShardSyncService] Uploading batch ${o+1}: ${Object.keys(r).length} files`),await m.updateGistFiles(r,t),r={},i=0,o++),r[n]=d,i+=c}Object.keys(r).length>0&&(u("Uploading final batch",{batch:o+1,fileCount:Object.keys(r).length}),await m.updateGistFiles(r,t))}async prepareMediaForUpload(s){const{url:t,type:e,source:a,originalUrl:r,mimeType:i}=s;let o=null;if(a==="local"?o=await z.getCachedBlob(t):a==="external"&&(o=await z.getCachedBlob(t)),!o||o.size===0)return{success:!1,size:0,error:"无法获取媒体文件"};if(o.size>B)return{success:!1,size:o.size,error:`文件过大(${X(o.size)})`};const n=await Y(o),d={url:t,type:e,source:a,mimeType:i||o.type,size:o.size,base64Data:n,syncedAt:Date.now(),syncedFromDevice:G(),originalUrl:a==="external"?r:void 0},c=l.getMasterGistId();if(!c)return{success:!1,size:o.size,error:"未配置主 Gist ID"};const h=await F.getPassword(),f=JSON.stringify(d,null,2);return{success:!0,content:await E.encrypt(f,c,h||void 0),size:o.size}}async getOrCreateShardManifest(s){try{const e=await m.getGistFileContent(y.SHARD_MANIFEST,s.gistId);if(e){const a=l.getMasterGistId();if(a){const r=await F.getPassword(),i=await E.decrypt(e,a,r||void 0);return JSON.parse(i)}return JSON.parse(e)}}catch(e){S("Failed to get shard manifest",{shard:s.alias,error:String(e)})}const t=l.getMasterGistId();if(!t)throw new Error("Master gist ID not configured");return R(s.alias,t)}async downloadMedia(s,t){const e={success:!0,uploaded:0,downloaded:0,deleted:0,skipped:0,details:[]};await l.initialize();for(let r=0;r<s.length;r++){const i=s[r];if(t==null||t(r+1,s.length,i,"downloading"),(await z.getCacheInfo(i)).isCached){e.skipped++,e.details.push({url:i,action:"skip",success:!0,error:"已缓存"});continue}const n=l.getFileIndexEntry(i);if(!n){e.details.push({url:i,action:"download",success:!1,error:"文件未同步"});continue}const d=l.getShard(n.shardId);if(!d){e.details.push({url:i,action:"download",success:!1,error:`分片 ${n.shardId} 不存在`});continue}try{const c=await m.getGistFileContent(n.filename,d.gistId);if(!c){e.details.push({url:i,action:"download",success:!1,error:"文件不存在"});continue}const h=l.getMasterGistId();if(!h){e.details.push({url:i,action:"download",success:!1,error:"未配置主 Gist ID"});continue}const f=await F.getPassword(),w=await E.decrypt(c,h,f||void 0),I=JSON.parse(w),g=K(I.base64Data,I.mimeType);if(!g||g.size===0){e.details.push({url:i,action:"download",success:!1,error:"文件数据无效"});continue}await z.cacheToCacheStorageOnly(i,g),e.downloaded++,e.details.push({url:i,action:"download",success:!0,shardId:n.shardId}),u("Downloaded and cached",{url:i})}catch(c){b(`Failed to download: ${i}`,c instanceof Error?c:new Error(String(c))),e.details.push({url:i,action:"download",success:!1,error:c instanceof Error?c.message:"下载失败"})}}e.success=e.downloaded>0||e.skipped>0;const a=e.details.filter(r=>!r.success).length;return e.downloaded>0?O("分片下载完成",{downloaded:e.downloaded,skipped:e.skipped,failed:a}):a>0&&S("分片下载部分失败",{downloaded:e.downloaded,skipped:e.skipped,failed:a}),e}async softDeleteMedia(s){const t={success:!0,uploaded:0,downloaded:0,deleted:0,skipped:0,details:[]};await l.initialize();const e=l.getMasterIndex();if(!e)return t.success=!1,t.error="主索引未加载",t;const a=G();for(const r of s){const i=l.getFileIndexEntry(r);if(!i){t.skipped++,t.details.push({url:r,action:"skip",success:!0,error:"文件未同步"});continue}const o=L(r,i.shardId,i.filename,i.size,a);e.tombstones.push(o),l.unregisterFile(r),t.deleted++,t.details.push({url:r,action:"delete",success:!0,shardId:i.shardId}),u("Soft deleted",{url:r})}return t.deleted>0&&await l.saveMasterIndexToRemote(),t}async restoreMedia(s){await l.initialize();const t=l.getMasterIndex();if(!t)return!1;const e=t.tombstones.findIndex(i=>i.url===s);if(e===-1)return S("No tombstone found",{url:s}),!1;const a=t.tombstones[e],r=l.getShard(a.shardId);if(!r)return S("Shard not found for restore",{shardId:a.shardId}),!1;try{const i=await m.getGistFileContent(a.filename,r.gistId);if(!i)return S("File not found in shard",{filename:a.filename}),!1;const o=l.getMasterGistId();if(!o)return S("Master gist ID not configured"),!1;const n=await F.getPassword(),d=await E.decrypt(i,o,n||void 0),c=JSON.parse(d);return l.registerFile(s,a.shardId,a.filename,a.size,c.type),t.tombstones.splice(e,1),await l.saveMasterIndexToRemote(),u("Restored",{url:s}),!0}catch(i){return b(`Failed to restore: ${s}`,i instanceof Error?i:new Error(String(i))),!1}}async cleanupExpiredTombstones(){await l.initialize();const s=l.getMasterIndex();if(!s)return 0;const t=s.tombstones.filter(A);if(t.length===0)return 0;u("Cleaning up expired tombstones",{count:t.length});const e={};for(const a of t)e[a.shardId]||(e[a.shardId]=[]),e[a.shardId].push(a.filename);for(const[a,r]of Object.entries(e)){const i=l.getShard(a);if(i)try{await m.deleteGistFiles(r,i.gistId),u("Deleted files from shard",{count:r.length,shardId:a})}catch(o){b(`Failed to delete files from shard: ${a}`,o instanceof Error?o:new Error(String(o)))}}return s.tombstones=s.tombstones.filter(a=>!A(a)),await l.saveMasterIndexToRemote(),t.length}async getSyncedUrls(){await l.initialize();const s=l.getMasterIndex();return s?new Set(Object.keys(s.fileIndex)):new Set}async getTombstones(){await l.initialize();const s=l.getMasterIndex();return s?[...s.tombstones]:[]}async isInTombstones(s){await l.initialize();const t=l.getMasterIndex();return t?t.tombstones.some(e=>e.url===s):!1}}const W=new P,q=Object.freeze(Object.defineProperty({__proto__:null,shardSyncService:W},Symbol.toStringTag,{value:"Module"}));export{W as a,q as b,l as s};
|
|
1
|
+
import{a6 as M,a7 as u,a8 as D,a9 as m,aa as y,ab as b,ac as T,ad as N,ae as j,af as $,ag as R,ah as F,ai as E,aj as S,ak as U,al as k,am as x,an as O,u as z,ao as _,ap as B,aq as L,ar as A,as as H}from"./index-CvvgEQLL.js";const v="github_sync_master_index",C="github_sync_master_gist_id";class J{constructor(){this.masterIndex=null,this.masterGistId=null,this.initialized=!1}async initialize(){this.initialized||(this.masterIndex=await M.get(v),this.masterGistId=await M.get(C),this.initialized=!0,u("ShardRouter initialized",{hasMasterIndex:!!this.masterIndex,masterGistId:this.masterGistId?D(this.masterGistId):null,shardCount:this.masterIndex?Object.keys(this.masterIndex.shards).length:0}))}getMasterIndex(){return this.masterIndex}getMasterGistId(){return this.masterGistId}async setMasterGistId(s){this.masterGistId=s,await M.set(C,s)}isConfigured(){return!!this.masterIndex&&!!this.masterGistId}async loadMasterIndexFromRemote(){if(!this.masterGistId)return u("No master gist ID configured"),null;try{const s=await m.getGistFileContent(y.MASTER_INDEX,this.masterGistId);if(!s)return u("No master index found in remote"),null;const t=JSON.parse(s);return this.masterIndex=t,await this.saveMasterIndexLocally(),u("Loaded master index from remote",{shards:Object.keys(t.shards).length,files:Object.keys(t.fileIndex).length}),t}catch(s){return b("Failed to load master index",s instanceof Error?s:new Error(String(s))),null}}async saveMasterIndexLocally(){this.masterIndex&&await M.set(v,this.masterIndex)}async saveMasterIndexToRemote(){if(!this.masterIndex||!this.masterGistId)throw new Error("Master index or gist ID not configured");T(this.masterIndex),await m.updateGistFiles({[y.MASTER_INDEX]:JSON.stringify(this.masterIndex,null,2)},this.masterGistId),await this.saveMasterIndexLocally(),u("Saved master index to remote")}async initializeMasterIndex(s){if(this.masterIndex)return this.masterIndex;if(this.masterIndex=N(s),!this.masterGistId)throw new Error("Master gist ID must be set before initializing index");return await this.saveMasterIndexLocally(),u("Initialized new master index"),this.masterIndex}getShardForFile(s){if(!this.masterIndex)return null;const t=this.masterIndex.fileIndex[s];return t&&this.masterIndex.shards[t.shardId]||null}getFileIndexEntry(s){return this.masterIndex&&this.masterIndex.fileIndex[s]||null}isFileSynced(s){return this.getFileIndexEntry(s)!==null}findActiveShard(s){if(!this.masterIndex)return null;const t=Object.values(this.masterIndex.shards).filter(e=>e.status==="active").sort((e,a)=>a.fileCount-e.fileCount);for(const e of t)if(j(e,s))return e;return null}async createShard(s){if(!this.masterIndex||!this.masterGistId)throw new Error("Master index not initialized");const t=Object.keys(this.masterIndex.shards).length+1,e=s||$(t);if(this.masterIndex.shards[e])throw new Error(`Shard alias "${e}" already exists`);const a=`${k.SHARD} #${t} (${e})`,r=R(e,this.masterGistId),i=await F.getPassword(),o=JSON.stringify(r,null,2),n=await E.encrypt(o,this.masterGistId,i||void 0),d=await m.createSyncGist({[y.SHARD_MANIFEST]:n});try{await m.updateGistFiles({[y.SHARD_MANIFEST]:n},d.id)}catch(h){S("Failed to update shard description",{error:String(h)})}const c=U(d.id,e,t);return c.description=a,this.masterIndex.shards[e]=c,T(this.masterIndex),u("Created new shard",{alias:e,gistId:D(d.id),order:t}),c}async allocateFile(s){if(!this.masterIndex)throw new Error("Master index not initialized");const t=this.findActiveShard(s);return t?{shard:t,isNewShard:!1}:{shard:await this.createShard(),isNewShard:!0}}async allocateFiles(s){if(!this.masterIndex)throw new Error("Master index not initialized");const t=new Map,e=[];let a=null,r=0,i=0;const o=Object.values(this.masterIndex.shards).filter(n=>n.status==="active").sort((n,d)=>d.fileCount-n.fileCount);o.length>0&&(a=o[0],r=a.fileCount,i=a.totalSize);for(const n of s){const d=this.masterIndex.fileIndex[n.url];if(d){const h=this.masterIndex.shards[d.shardId];if(h){t.set(n.url,h);continue}}if(!a||r>=x.FILE_LIMIT||i+n.size>x.SIZE_LIMIT){const h=await this.createShard();e.push(h),a=h,r=0,i=0}t.set(n.url,a),r++,i+=n.size}return u("Batch allocation completed",{totalFiles:s.length,newShardsCreated:e.length}),{allocations:t,newShards:e}}registerFile(s,t,e,a,r){if(!this.masterIndex)throw new Error("Master index not initialized");const i={shardId:t,filename:e,size:a,type:r,syncedAt:Date.now()};this.masterIndex.fileIndex[s]=i;const o=this.masterIndex.shards[t];o&&(o.fileCount++,o.totalSize+=a,o.updatedAt=Date.now(),o.fileCount>=x.FILE_LIMIT&&(o.status="full",u("Shard is now full",{shardId:t})))}unregisterFile(s){if(!this.masterIndex)return null;const t=this.masterIndex.fileIndex[s];if(!t)return null;delete this.masterIndex.fileIndex[s];const e=this.masterIndex.shards[t.shardId];return e&&(e.fileCount=Math.max(0,e.fileCount-1),e.totalSize=Math.max(0,e.totalSize-t.size),e.updatedAt=Date.now(),e.status==="full"&&e.fileCount<x.FILE_LIMIT&&(e.status="active",u("Shard reactivated",{shardId:t.shardId}))),t}getShard(s){return this.masterIndex&&this.masterIndex.shards[s]||null}getAllShards(){return this.masterIndex?Object.values(this.masterIndex.shards):[]}async updateShardAlias(s,t){if(!this.masterIndex)throw new Error("Master index not initialized");const e=this.masterIndex.shards[s];if(!e)throw new Error(`Shard "${s}" not found`);if(s!==t&&this.masterIndex.shards[t])throw new Error(`Alias "${t}" already exists`);for(const a of Object.keys(this.masterIndex.fileIndex)){const r=this.masterIndex.fileIndex[a];r.shardId===s&&(r.shardId=t)}for(const a of this.masterIndex.tombstones)a.shardId===s&&(a.shardId=t);delete this.masterIndex.shards[s],e.alias=t,e.description=`${k.SHARD} #${e.order} (${t})`,e.updatedAt=Date.now(),this.masterIndex.shards[t]=e,u("Updated shard alias",{old:s,new:t})}archiveShard(s){if(!this.masterIndex)throw new Error("Master index not initialized");const t=this.masterIndex.shards[s];if(!t)throw new Error(`Shard "${s}" not found`);t.status="archived",t.updatedAt=Date.now(),u("Archived shard",{shardId:s})}reactivateShard(s){if(!this.masterIndex)throw new Error("Master index not initialized");const t=this.masterIndex.shards[s];if(!t)throw new Error(`Shard "${s}" not found`);t.fileCount>=x.FILE_LIMIT?t.status="full":t.status="active",t.updatedAt=Date.now(),u("Reactivated shard",{shardId:s})}getStats(){if(!this.masterIndex)return{totalShards:0,activeShards:0,fullShards:0,archivedShards:0,totalFiles:0,totalSize:0};const s=Object.values(this.masterIndex.shards);return{totalShards:s.length,activeShards:s.filter(t=>t.status==="active").length,fullShards:s.filter(t=>t.status==="full").length,archivedShards:s.filter(t=>t.status==="archived").length,totalFiles:Object.keys(this.masterIndex.fileIndex).length,totalSize:s.reduce((t,e)=>t+e.totalSize,0)}}async clearLocalCache(){this.masterIndex=null,this.masterGistId=null,this.initialized=!1,await M.remove(v),await M.remove(C),u("Cleared local cache")}destroy(){this.masterIndex=null,this.masterGistId=null,this.initialized=!1}}const l=new J;function G(){return localStorage.getItem(H)||"unknown"}function X(p){return p<1024?`${p} B`:p<1024*1024?`${(p/1024).toFixed(1)} KB`:`${(p/1024/1024).toFixed(1)} MB`}async function Y(p){return new Promise((s,t)=>{const e=new FileReader;e.onloadend=()=>{const r=e.result.split(",")[1];s(r)},e.onerror=t,e.readAsDataURL(p)})}function K(p,s){const t=atob(p),e=new Uint8Array(t.length);for(let a=0;a<t.length;a++)e[a]=t.charCodeAt(a);return new Blob([e],{type:s})}class P{constructor(){this.syncingUrls=new Set}async uploadMedia(s,t){const e=Date.now(),a={success:!0,uploaded:0,downloaded:0,deleted:0,skipped:0,details:[]};if(await l.initialize(),!l.isConfigured())return a.success=!1,a.error="分片系统未配置",a;const r=s.filter(f=>this.syncingUrls.has(f.url)?(a.skipped++,a.details.push({url:f.url,action:"skip",success:!0,error:"正在同步中"}),!1):l.isFileSynced(f.url)?(a.skipped++,a.details.push({url:f.url,action:"skip",success:!0,error:"已同步"}),!1):!0);if(r.length===0)return a;const i=await this.getFileSizes(r),o=await l.allocateFiles(i),n=this.groupByShards(r,o.allocations),d=Object.keys(n);for(let f=0;f<d.length;f+=x.CONCURRENCY){const w=d.slice(f,f+x.CONCURRENCY);await Promise.all(w.map(I=>this.uploadToShard(I,n[I],a,t)))}await l.saveMasterIndexToRemote(),a.success=a.uploaded>0||a.skipped>0;const c=a.details.filter(f=>!f.success).length,h=Date.now()-e;return u("Upload completed",{uploaded:a.uploaded,skipped:a.skipped,failed:c,duration:h}),O("分片上传完成",{uploaded:a.uploaded,skipped:a.skipped,failed:c,duration:h}),a}async getFileSizes(s){const t=[];for(const e of s){let a=e.size||0;if(!a){const r=await z.getCachedBlob(e.url);a=(r==null?void 0:r.size)||0}t.push({url:e.url,size:a})}return t}groupByShards(s,t){const e={};for(const a of s){const r=t.get(a.url);r&&(e[r.alias]||(e[r.alias]=[]),e[r.alias].push(a))}return e}async uploadToShard(s,t,e,a){const r=l.getShard(s);if(!r){for(const n of t)e.details.push({url:n.url,action:"upload",success:!1,error:`分片 ${s} 不存在`});return}const i={},o=[];for(const n of t){this.syncingUrls.add(n.url);try{const d=await this.prepareMediaForUpload(n);if(d.success&&d.content){const c=`media_${_(n.url)}.json`;i[c]=d.content,o.push(n),l.registerFile(n.url,s,c,d.size,n.type),e.details.push({url:n.url,action:"upload",success:!0,shardId:s}),e.uploaded++,a==null||a(e.uploaded+e.skipped,e.uploaded+e.skipped+t.length,n.url,"uploading")}else e.details.push({url:n.url,action:"upload",success:!1,error:d.error||"准备上传失败"})}catch(d){b(`Failed to prepare: ${n.url}`,d instanceof Error?d:new Error(String(d))),e.details.push({url:n.url,action:"upload",success:!1,error:d instanceof Error?d.message:"上传失败"})}finally{this.syncingUrls.delete(n.url)}}if(Object.keys(i).length>0)try{const n=await this.getOrCreateShardManifest(r);for(const I of o){const g=`media_${_(I.url)}.json`;n.files[g]={url:I.url,type:I.type,size:I.size||0,mimeType:I.mimeType||"",syncedAt:Date.now(),syncedFromDevice:G()}}n.updatedAt=Date.now();const d=JSON.stringify(n,null,2),c=l.getMasterGistId();if(c){const I=await F.getPassword();i[y.SHARD_MANIFEST]=await E.encrypt(d,c,I||void 0)}else i[y.SHARD_MANIFEST]=d;const h=Object.values(i).reduce((I,g)=>I+g.length,0),f=Object.keys(i).length;u("Uploading to shard",{shardId:s,fileCount:f,totalSizeMB:(h/1024/1024).toFixed(2)});const w=8*1024*1024;h>w?(u("Total size exceeds limit, splitting into batches"),await this.uploadInBatches(i,r.gistId,w)):await m.updateGistFiles(i,r.gistId),u("Uploaded files to shard",{count:o.length,shardId:s})}catch(n){b(`Failed to update shard: ${s}`,n instanceof Error?n:new Error(String(n)));for(const d of o)l.unregisterFile(d.url);for(const d of o){const c=e.details.find(h=>h.url===d.url);c&&(c.success=!1,c.error="批量上传失败"),e.uploaded--}}}async uploadInBatches(s,t,e){const a=Object.entries(s);let r={},i=0,o=0;for(const[n,d]of a){const c=d.length;if(c>e){Object.keys(r).length>0&&(u("Uploading batch",{batch:o+1,fileCount:Object.keys(r).length}),await m.updateGistFiles(r,t),r={},i=0,o++),u("Uploading large file",{filename:n,sizeMB:(c/1024/1024).toFixed(2)}),await m.updateGistFiles({[n]:d},t),o++;continue}i+c>e&&Object.keys(r).length>0&&(u(`ShardSyncService] Uploading batch ${o+1}: ${Object.keys(r).length} files`),await m.updateGistFiles(r,t),r={},i=0,o++),r[n]=d,i+=c}Object.keys(r).length>0&&(u("Uploading final batch",{batch:o+1,fileCount:Object.keys(r).length}),await m.updateGistFiles(r,t))}async prepareMediaForUpload(s){const{url:t,type:e,source:a,originalUrl:r,mimeType:i}=s;let o=null;if(a==="local"?o=await z.getCachedBlob(t):a==="external"&&(o=await z.getCachedBlob(t)),!o||o.size===0)return{success:!1,size:0,error:"无法获取媒体文件"};if(o.size>B)return{success:!1,size:o.size,error:`文件过大(${X(o.size)})`};const n=await Y(o),d={url:t,type:e,source:a,mimeType:i||o.type,size:o.size,base64Data:n,syncedAt:Date.now(),syncedFromDevice:G(),originalUrl:a==="external"?r:void 0},c=l.getMasterGistId();if(!c)return{success:!1,size:o.size,error:"未配置主 Gist ID"};const h=await F.getPassword(),f=JSON.stringify(d,null,2);return{success:!0,content:await E.encrypt(f,c,h||void 0),size:o.size}}async getOrCreateShardManifest(s){try{const e=await m.getGistFileContent(y.SHARD_MANIFEST,s.gistId);if(e){const a=l.getMasterGistId();if(a){const r=await F.getPassword(),i=await E.decrypt(e,a,r||void 0);return JSON.parse(i)}return JSON.parse(e)}}catch(e){S("Failed to get shard manifest",{shard:s.alias,error:String(e)})}const t=l.getMasterGistId();if(!t)throw new Error("Master gist ID not configured");return R(s.alias,t)}async downloadMedia(s,t){const e={success:!0,uploaded:0,downloaded:0,deleted:0,skipped:0,details:[]};await l.initialize();for(let r=0;r<s.length;r++){const i=s[r];if(t==null||t(r+1,s.length,i,"downloading"),(await z.getCacheInfo(i)).isCached){e.skipped++,e.details.push({url:i,action:"skip",success:!0,error:"已缓存"});continue}const n=l.getFileIndexEntry(i);if(!n){e.details.push({url:i,action:"download",success:!1,error:"文件未同步"});continue}const d=l.getShard(n.shardId);if(!d){e.details.push({url:i,action:"download",success:!1,error:`分片 ${n.shardId} 不存在`});continue}try{const c=await m.getGistFileContent(n.filename,d.gistId);if(!c){e.details.push({url:i,action:"download",success:!1,error:"文件不存在"});continue}const h=l.getMasterGistId();if(!h){e.details.push({url:i,action:"download",success:!1,error:"未配置主 Gist ID"});continue}const f=await F.getPassword(),w=await E.decrypt(c,h,f||void 0),I=JSON.parse(w),g=K(I.base64Data,I.mimeType);if(!g||g.size===0){e.details.push({url:i,action:"download",success:!1,error:"文件数据无效"});continue}await z.cacheToCacheStorageOnly(i,g),e.downloaded++,e.details.push({url:i,action:"download",success:!0,shardId:n.shardId}),u("Downloaded and cached",{url:i})}catch(c){b(`Failed to download: ${i}`,c instanceof Error?c:new Error(String(c))),e.details.push({url:i,action:"download",success:!1,error:c instanceof Error?c.message:"下载失败"})}}e.success=e.downloaded>0||e.skipped>0;const a=e.details.filter(r=>!r.success).length;return e.downloaded>0?O("分片下载完成",{downloaded:e.downloaded,skipped:e.skipped,failed:a}):a>0&&S("分片下载部分失败",{downloaded:e.downloaded,skipped:e.skipped,failed:a}),e}async softDeleteMedia(s){const t={success:!0,uploaded:0,downloaded:0,deleted:0,skipped:0,details:[]};await l.initialize();const e=l.getMasterIndex();if(!e)return t.success=!1,t.error="主索引未加载",t;const a=G();for(const r of s){const i=l.getFileIndexEntry(r);if(!i){t.skipped++,t.details.push({url:r,action:"skip",success:!0,error:"文件未同步"});continue}const o=L(r,i.shardId,i.filename,i.size,a);e.tombstones.push(o),l.unregisterFile(r),t.deleted++,t.details.push({url:r,action:"delete",success:!0,shardId:i.shardId}),u("Soft deleted",{url:r})}return t.deleted>0&&await l.saveMasterIndexToRemote(),t}async restoreMedia(s){await l.initialize();const t=l.getMasterIndex();if(!t)return!1;const e=t.tombstones.findIndex(i=>i.url===s);if(e===-1)return S("No tombstone found",{url:s}),!1;const a=t.tombstones[e],r=l.getShard(a.shardId);if(!r)return S("Shard not found for restore",{shardId:a.shardId}),!1;try{const i=await m.getGistFileContent(a.filename,r.gistId);if(!i)return S("File not found in shard",{filename:a.filename}),!1;const o=l.getMasterGistId();if(!o)return S("Master gist ID not configured"),!1;const n=await F.getPassword(),d=await E.decrypt(i,o,n||void 0),c=JSON.parse(d);return l.registerFile(s,a.shardId,a.filename,a.size,c.type),t.tombstones.splice(e,1),await l.saveMasterIndexToRemote(),u("Restored",{url:s}),!0}catch(i){return b(`Failed to restore: ${s}`,i instanceof Error?i:new Error(String(i))),!1}}async cleanupExpiredTombstones(){await l.initialize();const s=l.getMasterIndex();if(!s)return 0;const t=s.tombstones.filter(A);if(t.length===0)return 0;u("Cleaning up expired tombstones",{count:t.length});const e={};for(const a of t)e[a.shardId]||(e[a.shardId]=[]),e[a.shardId].push(a.filename);for(const[a,r]of Object.entries(e)){const i=l.getShard(a);if(i)try{await m.deleteGistFiles(r,i.gistId),u("Deleted files from shard",{count:r.length,shardId:a})}catch(o){b(`Failed to delete files from shard: ${a}`,o instanceof Error?o:new Error(String(o)))}}return s.tombstones=s.tombstones.filter(a=>!A(a)),await l.saveMasterIndexToRemote(),t.length}async getSyncedUrls(){await l.initialize();const s=l.getMasterIndex();return s?new Set(Object.keys(s.fileIndex)):new Set}async getTombstones(){await l.initialize();const s=l.getMasterIndex();return s?[...s.tombstones]:[]}async isInTombstones(s){await l.initialize();const t=l.getMasterIndex();return t?t.tombstones.some(e=>e.url===s):!1}}const W=new P,q=Object.freeze(Object.defineProperty({__proto__:null,shardSyncService:W},Symbol.toStringTag,{value:"Module"}));export{W as a,q as b,l as s};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as P,d as N,p as W}from"./styles-6aaf32cf-BTv8Dnxa.js";import{g as t,d as H,l as b,e as R,k as T,t as v,u as U}from"./mermaid.core-DawxQi4y.js";import{G as C}from"./graph-BbAdRpyG.js";import{l as F}from"./layout-CSua1dGC.js";import{l as $}from"./line-CN9rNlXr.js";import"./index-7WzIC7_D.js";import"./array-B5oSNiGi.js";import"./path-CY0bYimO.js";const O=e=>e.append("circle").attr("class","start-state").attr("r",t().state.sizeUnit).attr("cx",t().state.padding+t().state.sizeUnit).attr("cy",t().state.padding+t().state.sizeUnit),X=e=>e.append("line").style("stroke","grey").style("stroke-dasharray","3").attr("x1",t().state.textHeight).attr("class","divider").attr("x2",t().state.textHeight*2).attr("y1",0).attr("y2",0),J=(e,i)=>{const o=e.append("text").attr("x",2*t().state.padding).attr("y",t().state.textHeight+2*t().state.padding).attr("font-size",t().state.fontSize).attr("class","state-title").text(i.id),c=o.node().getBBox();return e.insert("rect",":first-child").attr("x",t().state.padding).attr("y",t().state.padding).attr("width",c.width+2*t().state.padding).attr("height",c.height+2*t().state.padding).attr("rx",t().state.radius),o},Y=(e,i)=>{const o=function(l,m,w){const E=l.append("tspan").attr("x",2*t().state.padding).text(m);w||E.attr("dy",t().state.textHeight)},s=e.append("text").attr("x",2*t().state.padding).attr("y",t().state.textHeight+1.3*t().state.padding).attr("font-size",t().state.fontSize).attr("class","state-title").text(i.descriptions[0]).node().getBBox(),g=s.height,p=e.append("text").attr("x",t().state.padding).attr("y",g+t().state.padding*.4+t().state.dividerMargin+t().state.textHeight).attr("class","state-description");let a=!0,r=!0;i.descriptions.forEach(function(l){a||(o(p,l,r),r=!1),a=!1});const y=e.append("line").attr("x1",t().state.padding).attr("y1",t().state.padding+g+t().state.dividerMargin/2).attr("y2",t().state.padding+g+t().state.dividerMargin/2).attr("class","descr-divider"),x=p.node().getBBox(),d=Math.max(x.width,s.width);return y.attr("x2",d+3*t().state.padding),e.insert("rect",":first-child").attr("x",t().state.padding).attr("y",t().state.padding).attr("width",d+2*t().state.padding).attr("height",x.height+g+2*t().state.padding).attr("rx",t().state.radius),e},I=(e,i,o)=>{const c=t().state.padding,s=2*t().state.padding,g=e.node().getBBox(),p=g.width,a=g.x,r=e.append("text").attr("x",0).attr("y",t().state.titleShift).attr("font-size",t().state.fontSize).attr("class","state-title").text(i.id),x=r.node().getBBox().width+s;let d=Math.max(x,p);d===p&&(d=d+s);let l;const m=e.node().getBBox();i.doc,l=a-c,x>p&&(l=(p-d)/2+c),Math.abs(a-m.x)<c&&x>p&&(l=a-(x-p)/2);const w=1-t().state.textHeight;return e.insert("rect",":first-child").attr("x",l).attr("y",w).attr("class",o?"alt-composit":"composit").attr("width",d).attr("height",m.height+t().state.textHeight+t().state.titleShift+1).attr("rx","0"),r.attr("x",l+c),x<=p&&r.attr("x",a+(d-s)/2-x/2+c),e.insert("rect",":first-child").attr("x",l).attr("y",t().state.titleShift-t().state.textHeight-t().state.padding).attr("width",d).attr("height",t().state.textHeight*3).attr("rx",t().state.radius),e.insert("rect",":first-child").attr("x",l).attr("y",t().state.titleShift-t().state.textHeight-t().state.padding).attr("width",d).attr("height",m.height+3+2*t().state.textHeight).attr("rx",t().state.radius),e},_=e=>(e.append("circle").attr("class","end-state-outer").attr("r",t().state.sizeUnit+t().state.miniPadding).attr("cx",t().state.padding+t().state.sizeUnit+t().state.miniPadding).attr("cy",t().state.padding+t().state.sizeUnit+t().state.miniPadding),e.append("circle").attr("class","end-state-inner").attr("r",t().state.sizeUnit).attr("cx",t().state.padding+t().state.sizeUnit+2).attr("cy",t().state.padding+t().state.sizeUnit+2)),q=(e,i)=>{let o=t().state.forkWidth,c=t().state.forkHeight;if(i.parentId){let s=o;o=c,c=s}return e.append("rect").style("stroke","black").style("fill","black").attr("width",o).attr("height",c).attr("x",t().state.padding).attr("y",t().state.padding)},Z=(e,i,o,c)=>{let s=0;const g=c.append("text");g.style("text-anchor","start"),g.attr("class","noteText");let p=e.replace(/\r\n/g,"<br/>");p=p.replace(/\n/g,"<br/>");const a=p.split(T.lineBreakRegex);let r=1.25*t().state.noteMargin;for(const y of a){const x=y.trim();if(x.length>0){const d=g.append("tspan");if(d.text(x),r===0){const l=d.node().getBBox();r+=l.height}s+=r,d.attr("x",i+t().state.noteMargin),d.attr("y",o+s+1.25*t().state.noteMargin)}}return{textWidth:g.node().getBBox().width,textHeight:s}},K=(e,i)=>{i.attr("class","state-note");const o=i.append("rect").attr("x",0).attr("y",t().state.padding),c=i.append("g"),{textWidth:s,textHeight:g}=Z(e,0,0,c);return o.attr("height",g+2*t().state.noteMargin),o.attr("width",s+t().state.noteMargin*2),o},L=function(e,i){const o=i.id,c={id:o,label:i.id,width:0,height:0},s=e.append("g").attr("id",o).attr("class","stateGroup");i.type==="start"&&O(s),i.type==="end"&&_(s),(i.type==="fork"||i.type==="join")&&q(s,i),i.type==="note"&&K(i.note.text,s),i.type==="divider"&&X(s),i.type==="default"&&i.descriptions.length===0&&J(s,i),i.type==="default"&&i.descriptions.length>0&&Y(s,i);const g=s.node().getBBox();return c.width=g.width+2*t().state.padding,c.height=g.height+2*t().state.padding,c};let G=0;const Q=function(e,i,o){const c=function(r){switch(r){case N.relationType.AGGREGATION:return"aggregation";case N.relationType.EXTENSION:return"extension";case N.relationType.COMPOSITION:return"composition";case N.relationType.DEPENDENCY:return"dependency"}};i.points=i.points.filter(r=>!Number.isNaN(r.y));const s=i.points,g=$().x(function(r){return r.x}).y(function(r){return r.y}).curve(v),p=e.append("path").attr("d",g(s)).attr("id","edge"+G).attr("class","transition");let a="";if(t().state.arrowMarkerAbsolute&&(a=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,a=a.replace(/\(/g,"\\("),a=a.replace(/\)/g,"\\)")),p.attr("marker-end","url("+a+"#"+c(N.relationType.DEPENDENCY)+"End)"),o.title!==void 0){const r=e.append("g").attr("class","stateLabel"),{x:y,y:x}=U.calcLabelPosition(i.points),d=T.getRows(o.title);let l=0;const m=[];let w=0,E=0;for(let u=0;u<=d.length;u++){const h=r.append("text").attr("text-anchor","middle").text(d[u]).attr("x",y).attr("y",x+l),f=h.node().getBBox();w=Math.max(w,f.width),E=Math.min(E,f.x),b.info(f.x,y,x+l),l===0&&(l=h.node().getBBox().height,b.info("Title height",l,x)),m.push(h)}let k=l*d.length;if(d.length>1){const u=(d.length-1)*l*.5;m.forEach((h,f)=>h.attr("y",x+f*l-u)),k=l*d.length}const n=r.node().getBBox();r.insert("rect",":first-child").attr("class","box").attr("x",y-w/2-t().state.padding/2).attr("y",x-k/2-t().state.padding/2-3.5).attr("width",w+t().state.padding).attr("height",k+t().state.padding),b.info(n)}G++};let B;const z={},V=function(){},j=function(e){e.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},D=function(e,i,o,c){B=t().state;const s=t().securityLevel;let g;s==="sandbox"&&(g=H("#i"+i));const p=s==="sandbox"?H(g.nodes()[0].contentDocument.body):H("body"),a=s==="sandbox"?g.nodes()[0].contentDocument:document;b.debug("Rendering diagram "+e);const r=p.select(`[id='${i}']`);j(r);const y=c.db.getRootDoc();A(y,r,void 0,!1,p,a,c);const x=B.padding,d=r.node().getBBox(),l=d.width+x*2,m=d.height+x*2,w=l*1.75;R(r,m,w,B.useMaxWidth),r.attr("viewBox",`${d.x-B.padding} ${d.y-B.padding} `+l+" "+m)},tt=e=>e?e.length*B.fontSizeFactor:1,A=(e,i,o,c,s,g,p)=>{const a=new C({compound:!0,multigraph:!0});let r,y=!0;for(r=0;r<e.length;r++)if(e[r].stmt==="relation"){y=!1;break}o?a.setGraph({rankdir:"LR",multigraph:!0,compound:!0,ranker:"tight-tree",ranksep:y?1:B.edgeLengthFactor,nodeSep:y?1:50,isMultiGraph:!0}):a.setGraph({rankdir:"TB",multigraph:!0,compound:!0,ranksep:y?1:B.edgeLengthFactor,nodeSep:y?1:50,ranker:"tight-tree",isMultiGraph:!0}),a.setDefaultEdgeLabel(function(){return{}}),p.db.extract(e);const x=p.db.getStates(),d=p.db.getRelations(),l=Object.keys(x);for(const n of l){const u=x[n];o&&(u.parentId=o);let h;if(u.doc){let f=i.append("g").attr("id",u.id).attr("class","stateGroup");h=A(u.doc,f,u.id,!c,s,g,p);{f=I(f,u,c);let S=f.node().getBBox();h.width=S.width,h.height=S.height+B.padding/2,z[u.id]={y:B.compositTitleSize}}}else h=L(i,u);if(u.note){const f={descriptions:[],id:u.id+"-note",note:u.note,type:"note"},S=L(i,f);u.note.position==="left of"?(a.setNode(h.id+"-note",S),a.setNode(h.id,h)):(a.setNode(h.id,h),a.setNode(h.id+"-note",S)),a.setParent(h.id,h.id+"-group"),a.setParent(h.id+"-note",h.id+"-group")}else a.setNode(h.id,h)}b.debug("Count=",a.nodeCount(),a);let m=0;d.forEach(function(n){m++,b.debug("Setting edge",n),a.setEdge(n.id1,n.id2,{relation:n,width:tt(n.title),height:B.labelHeight*T.getRows(n.title).length,labelpos:"c"},"id"+m)}),F(a),b.debug("Graph after layout",a.nodes());const w=i.node();a.nodes().forEach(function(n){n!==void 0&&a.node(n)!==void 0?(b.warn("Node "+n+": "+JSON.stringify(a.node(n))),s.select("#"+w.id+" #"+n).attr("transform","translate("+(a.node(n).x-a.node(n).width/2)+","+(a.node(n).y+(z[n]?z[n].y:0)-a.node(n).height/2)+" )"),s.select("#"+w.id+" #"+n).attr("data-x-shift",a.node(n).x-a.node(n).width/2),g.querySelectorAll("#"+w.id+" #"+n+" .divider").forEach(h=>{const f=h.parentElement;let S=0,M=0;f&&(f.parentElement&&(S=f.parentElement.getBBox().width),M=parseInt(f.getAttribute("data-x-shift"),10),Number.isNaN(M)&&(M=0)),h.setAttribute("x1",0-M+8),h.setAttribute("x2",S-M-8)})):b.debug("No Node "+n+": "+JSON.stringify(a.node(n)))});let E=w.getBBox();a.edges().forEach(function(n){n!==void 0&&a.edge(n)!==void 0&&(b.debug("Edge "+n.v+" -> "+n.w+": "+JSON.stringify(a.edge(n))),Q(i,a.edge(n),a.edge(n).relation))}),E=w.getBBox();const k={id:o||"root",label:o||"root",width:0,height:0};return k.width=E.width+2*B.padding,k.height=E.height+2*B.padding,b.debug("Doc rendered",k,a),k},et={setConf:V,draw:D},lt={parser:W,db:N,renderer:et,styles:P,init:e=>{e.state||(e.state={}),e.state.arrowMarkerAbsolute=e.arrowMarkerAbsolute,N.clear()}};export{lt as diagram};
|
|
1
|
+
import{s as P,d as N,p as W}from"./styles-6aaf32cf-DPVcUAPG.js";import{g as t,d as H,l as b,e as R,k as T,t as v,u as U}from"./mermaid.core-Bse-qmGl.js";import{G as C}from"./graph-B8wbK8JG.js";import{l as F}from"./layout-DFY48Wfc.js";import{l as $}from"./line-CS-j1kBY.js";import"./index-CvvgEQLL.js";import"./array-B5oSNiGi.js";import"./path-CY0bYimO.js";const O=e=>e.append("circle").attr("class","start-state").attr("r",t().state.sizeUnit).attr("cx",t().state.padding+t().state.sizeUnit).attr("cy",t().state.padding+t().state.sizeUnit),X=e=>e.append("line").style("stroke","grey").style("stroke-dasharray","3").attr("x1",t().state.textHeight).attr("class","divider").attr("x2",t().state.textHeight*2).attr("y1",0).attr("y2",0),J=(e,i)=>{const o=e.append("text").attr("x",2*t().state.padding).attr("y",t().state.textHeight+2*t().state.padding).attr("font-size",t().state.fontSize).attr("class","state-title").text(i.id),c=o.node().getBBox();return e.insert("rect",":first-child").attr("x",t().state.padding).attr("y",t().state.padding).attr("width",c.width+2*t().state.padding).attr("height",c.height+2*t().state.padding).attr("rx",t().state.radius),o},Y=(e,i)=>{const o=function(l,m,w){const E=l.append("tspan").attr("x",2*t().state.padding).text(m);w||E.attr("dy",t().state.textHeight)},s=e.append("text").attr("x",2*t().state.padding).attr("y",t().state.textHeight+1.3*t().state.padding).attr("font-size",t().state.fontSize).attr("class","state-title").text(i.descriptions[0]).node().getBBox(),g=s.height,p=e.append("text").attr("x",t().state.padding).attr("y",g+t().state.padding*.4+t().state.dividerMargin+t().state.textHeight).attr("class","state-description");let a=!0,r=!0;i.descriptions.forEach(function(l){a||(o(p,l,r),r=!1),a=!1});const y=e.append("line").attr("x1",t().state.padding).attr("y1",t().state.padding+g+t().state.dividerMargin/2).attr("y2",t().state.padding+g+t().state.dividerMargin/2).attr("class","descr-divider"),x=p.node().getBBox(),d=Math.max(x.width,s.width);return y.attr("x2",d+3*t().state.padding),e.insert("rect",":first-child").attr("x",t().state.padding).attr("y",t().state.padding).attr("width",d+2*t().state.padding).attr("height",x.height+g+2*t().state.padding).attr("rx",t().state.radius),e},I=(e,i,o)=>{const c=t().state.padding,s=2*t().state.padding,g=e.node().getBBox(),p=g.width,a=g.x,r=e.append("text").attr("x",0).attr("y",t().state.titleShift).attr("font-size",t().state.fontSize).attr("class","state-title").text(i.id),x=r.node().getBBox().width+s;let d=Math.max(x,p);d===p&&(d=d+s);let l;const m=e.node().getBBox();i.doc,l=a-c,x>p&&(l=(p-d)/2+c),Math.abs(a-m.x)<c&&x>p&&(l=a-(x-p)/2);const w=1-t().state.textHeight;return e.insert("rect",":first-child").attr("x",l).attr("y",w).attr("class",o?"alt-composit":"composit").attr("width",d).attr("height",m.height+t().state.textHeight+t().state.titleShift+1).attr("rx","0"),r.attr("x",l+c),x<=p&&r.attr("x",a+(d-s)/2-x/2+c),e.insert("rect",":first-child").attr("x",l).attr("y",t().state.titleShift-t().state.textHeight-t().state.padding).attr("width",d).attr("height",t().state.textHeight*3).attr("rx",t().state.radius),e.insert("rect",":first-child").attr("x",l).attr("y",t().state.titleShift-t().state.textHeight-t().state.padding).attr("width",d).attr("height",m.height+3+2*t().state.textHeight).attr("rx",t().state.radius),e},_=e=>(e.append("circle").attr("class","end-state-outer").attr("r",t().state.sizeUnit+t().state.miniPadding).attr("cx",t().state.padding+t().state.sizeUnit+t().state.miniPadding).attr("cy",t().state.padding+t().state.sizeUnit+t().state.miniPadding),e.append("circle").attr("class","end-state-inner").attr("r",t().state.sizeUnit).attr("cx",t().state.padding+t().state.sizeUnit+2).attr("cy",t().state.padding+t().state.sizeUnit+2)),q=(e,i)=>{let o=t().state.forkWidth,c=t().state.forkHeight;if(i.parentId){let s=o;o=c,c=s}return e.append("rect").style("stroke","black").style("fill","black").attr("width",o).attr("height",c).attr("x",t().state.padding).attr("y",t().state.padding)},Z=(e,i,o,c)=>{let s=0;const g=c.append("text");g.style("text-anchor","start"),g.attr("class","noteText");let p=e.replace(/\r\n/g,"<br/>");p=p.replace(/\n/g,"<br/>");const a=p.split(T.lineBreakRegex);let r=1.25*t().state.noteMargin;for(const y of a){const x=y.trim();if(x.length>0){const d=g.append("tspan");if(d.text(x),r===0){const l=d.node().getBBox();r+=l.height}s+=r,d.attr("x",i+t().state.noteMargin),d.attr("y",o+s+1.25*t().state.noteMargin)}}return{textWidth:g.node().getBBox().width,textHeight:s}},K=(e,i)=>{i.attr("class","state-note");const o=i.append("rect").attr("x",0).attr("y",t().state.padding),c=i.append("g"),{textWidth:s,textHeight:g}=Z(e,0,0,c);return o.attr("height",g+2*t().state.noteMargin),o.attr("width",s+t().state.noteMargin*2),o},L=function(e,i){const o=i.id,c={id:o,label:i.id,width:0,height:0},s=e.append("g").attr("id",o).attr("class","stateGroup");i.type==="start"&&O(s),i.type==="end"&&_(s),(i.type==="fork"||i.type==="join")&&q(s,i),i.type==="note"&&K(i.note.text,s),i.type==="divider"&&X(s),i.type==="default"&&i.descriptions.length===0&&J(s,i),i.type==="default"&&i.descriptions.length>0&&Y(s,i);const g=s.node().getBBox();return c.width=g.width+2*t().state.padding,c.height=g.height+2*t().state.padding,c};let G=0;const Q=function(e,i,o){const c=function(r){switch(r){case N.relationType.AGGREGATION:return"aggregation";case N.relationType.EXTENSION:return"extension";case N.relationType.COMPOSITION:return"composition";case N.relationType.DEPENDENCY:return"dependency"}};i.points=i.points.filter(r=>!Number.isNaN(r.y));const s=i.points,g=$().x(function(r){return r.x}).y(function(r){return r.y}).curve(v),p=e.append("path").attr("d",g(s)).attr("id","edge"+G).attr("class","transition");let a="";if(t().state.arrowMarkerAbsolute&&(a=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,a=a.replace(/\(/g,"\\("),a=a.replace(/\)/g,"\\)")),p.attr("marker-end","url("+a+"#"+c(N.relationType.DEPENDENCY)+"End)"),o.title!==void 0){const r=e.append("g").attr("class","stateLabel"),{x:y,y:x}=U.calcLabelPosition(i.points),d=T.getRows(o.title);let l=0;const m=[];let w=0,E=0;for(let u=0;u<=d.length;u++){const h=r.append("text").attr("text-anchor","middle").text(d[u]).attr("x",y).attr("y",x+l),f=h.node().getBBox();w=Math.max(w,f.width),E=Math.min(E,f.x),b.info(f.x,y,x+l),l===0&&(l=h.node().getBBox().height,b.info("Title height",l,x)),m.push(h)}let k=l*d.length;if(d.length>1){const u=(d.length-1)*l*.5;m.forEach((h,f)=>h.attr("y",x+f*l-u)),k=l*d.length}const n=r.node().getBBox();r.insert("rect",":first-child").attr("class","box").attr("x",y-w/2-t().state.padding/2).attr("y",x-k/2-t().state.padding/2-3.5).attr("width",w+t().state.padding).attr("height",k+t().state.padding),b.info(n)}G++};let B;const z={},V=function(){},j=function(e){e.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},D=function(e,i,o,c){B=t().state;const s=t().securityLevel;let g;s==="sandbox"&&(g=H("#i"+i));const p=s==="sandbox"?H(g.nodes()[0].contentDocument.body):H("body"),a=s==="sandbox"?g.nodes()[0].contentDocument:document;b.debug("Rendering diagram "+e);const r=p.select(`[id='${i}']`);j(r);const y=c.db.getRootDoc();A(y,r,void 0,!1,p,a,c);const x=B.padding,d=r.node().getBBox(),l=d.width+x*2,m=d.height+x*2,w=l*1.75;R(r,m,w,B.useMaxWidth),r.attr("viewBox",`${d.x-B.padding} ${d.y-B.padding} `+l+" "+m)},tt=e=>e?e.length*B.fontSizeFactor:1,A=(e,i,o,c,s,g,p)=>{const a=new C({compound:!0,multigraph:!0});let r,y=!0;for(r=0;r<e.length;r++)if(e[r].stmt==="relation"){y=!1;break}o?a.setGraph({rankdir:"LR",multigraph:!0,compound:!0,ranker:"tight-tree",ranksep:y?1:B.edgeLengthFactor,nodeSep:y?1:50,isMultiGraph:!0}):a.setGraph({rankdir:"TB",multigraph:!0,compound:!0,ranksep:y?1:B.edgeLengthFactor,nodeSep:y?1:50,ranker:"tight-tree",isMultiGraph:!0}),a.setDefaultEdgeLabel(function(){return{}}),p.db.extract(e);const x=p.db.getStates(),d=p.db.getRelations(),l=Object.keys(x);for(const n of l){const u=x[n];o&&(u.parentId=o);let h;if(u.doc){let f=i.append("g").attr("id",u.id).attr("class","stateGroup");h=A(u.doc,f,u.id,!c,s,g,p);{f=I(f,u,c);let S=f.node().getBBox();h.width=S.width,h.height=S.height+B.padding/2,z[u.id]={y:B.compositTitleSize}}}else h=L(i,u);if(u.note){const f={descriptions:[],id:u.id+"-note",note:u.note,type:"note"},S=L(i,f);u.note.position==="left of"?(a.setNode(h.id+"-note",S),a.setNode(h.id,h)):(a.setNode(h.id,h),a.setNode(h.id+"-note",S)),a.setParent(h.id,h.id+"-group"),a.setParent(h.id+"-note",h.id+"-group")}else a.setNode(h.id,h)}b.debug("Count=",a.nodeCount(),a);let m=0;d.forEach(function(n){m++,b.debug("Setting edge",n),a.setEdge(n.id1,n.id2,{relation:n,width:tt(n.title),height:B.labelHeight*T.getRows(n.title).length,labelpos:"c"},"id"+m)}),F(a),b.debug("Graph after layout",a.nodes());const w=i.node();a.nodes().forEach(function(n){n!==void 0&&a.node(n)!==void 0?(b.warn("Node "+n+": "+JSON.stringify(a.node(n))),s.select("#"+w.id+" #"+n).attr("transform","translate("+(a.node(n).x-a.node(n).width/2)+","+(a.node(n).y+(z[n]?z[n].y:0)-a.node(n).height/2)+" )"),s.select("#"+w.id+" #"+n).attr("data-x-shift",a.node(n).x-a.node(n).width/2),g.querySelectorAll("#"+w.id+" #"+n+" .divider").forEach(h=>{const f=h.parentElement;let S=0,M=0;f&&(f.parentElement&&(S=f.parentElement.getBBox().width),M=parseInt(f.getAttribute("data-x-shift"),10),Number.isNaN(M)&&(M=0)),h.setAttribute("x1",0-M+8),h.setAttribute("x2",S-M-8)})):b.debug("No Node "+n+": "+JSON.stringify(a.node(n)))});let E=w.getBBox();a.edges().forEach(function(n){n!==void 0&&a.edge(n)!==void 0&&(b.debug("Edge "+n.v+" -> "+n.w+": "+JSON.stringify(a.edge(n))),Q(i,a.edge(n),a.edge(n).relation))}),E=w.getBBox();const k={id:o||"root",label:o||"root",width:0,height:0};return k.width=E.width+2*B.padding,k.height=E.height+2*B.padding,b.debug("Doc rendered",k,a),k},et={setConf:V,draw:D},lt={parser:W,db:N,renderer:et,styles:P,init:e=>{e.state||(e.state={}),e.state.arrowMarkerAbsolute=e.arrowMarkerAbsolute,N.clear()}};export{lt as diagram};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as P,d as N,p as W}from"./styles-6aaf32cf-B_EWv7Bz.js";import{g as t,d as H,l as b,e as R,k as T,t as v,u as U}from"./index-Cx19IgV-.js";import{G as C}from"./graph-CG3zmXkL.js";import{l as F}from"./layout-D_agYVJ_.js";import{l as $}from"./line-CxGDlzoc.js";import"./index-7WzIC7_D.js";import"./isEmpty-BoFRUVaJ.js";import"./has-Cq7YuzG9.js";import"./hasIn-4hPyOh4r.js";import"./pick-C1hcXSqm.js";import"./array-BKyUJesY.js";import"./path-CbwjOpE9.js";const O=e=>e.append("circle").attr("class","start-state").attr("r",t().state.sizeUnit).attr("cx",t().state.padding+t().state.sizeUnit).attr("cy",t().state.padding+t().state.sizeUnit),X=e=>e.append("line").style("stroke","grey").style("stroke-dasharray","3").attr("x1",t().state.textHeight).attr("class","divider").attr("x2",t().state.textHeight*2).attr("y1",0).attr("y2",0),J=(e,i)=>{const o=e.append("text").attr("x",2*t().state.padding).attr("y",t().state.textHeight+2*t().state.padding).attr("font-size",t().state.fontSize).attr("class","state-title").text(i.id),c=o.node().getBBox();return e.insert("rect",":first-child").attr("x",t().state.padding).attr("y",t().state.padding).attr("width",c.width+2*t().state.padding).attr("height",c.height+2*t().state.padding).attr("rx",t().state.radius),o},Y=(e,i)=>{const o=function(l,m,w){const E=l.append("tspan").attr("x",2*t().state.padding).text(m);w||E.attr("dy",t().state.textHeight)},s=e.append("text").attr("x",2*t().state.padding).attr("y",t().state.textHeight+1.3*t().state.padding).attr("font-size",t().state.fontSize).attr("class","state-title").text(i.descriptions[0]).node().getBBox(),g=s.height,p=e.append("text").attr("x",t().state.padding).attr("y",g+t().state.padding*.4+t().state.dividerMargin+t().state.textHeight).attr("class","state-description");let a=!0,r=!0;i.descriptions.forEach(function(l){a||(o(p,l,r),r=!1),a=!1});const y=e.append("line").attr("x1",t().state.padding).attr("y1",t().state.padding+g+t().state.dividerMargin/2).attr("y2",t().state.padding+g+t().state.dividerMargin/2).attr("class","descr-divider"),x=p.node().getBBox(),d=Math.max(x.width,s.width);return y.attr("x2",d+3*t().state.padding),e.insert("rect",":first-child").attr("x",t().state.padding).attr("y",t().state.padding).attr("width",d+2*t().state.padding).attr("height",x.height+g+2*t().state.padding).attr("rx",t().state.radius),e},I=(e,i,o)=>{const c=t().state.padding,s=2*t().state.padding,g=e.node().getBBox(),p=g.width,a=g.x,r=e.append("text").attr("x",0).attr("y",t().state.titleShift).attr("font-size",t().state.fontSize).attr("class","state-title").text(i.id),x=r.node().getBBox().width+s;let d=Math.max(x,p);d===p&&(d=d+s);let l;const m=e.node().getBBox();i.doc,l=a-c,x>p&&(l=(p-d)/2+c),Math.abs(a-m.x)<c&&x>p&&(l=a-(x-p)/2);const w=1-t().state.textHeight;return e.insert("rect",":first-child").attr("x",l).attr("y",w).attr("class",o?"alt-composit":"composit").attr("width",d).attr("height",m.height+t().state.textHeight+t().state.titleShift+1).attr("rx","0"),r.attr("x",l+c),x<=p&&r.attr("x",a+(d-s)/2-x/2+c),e.insert("rect",":first-child").attr("x",l).attr("y",t().state.titleShift-t().state.textHeight-t().state.padding).attr("width",d).attr("height",t().state.textHeight*3).attr("rx",t().state.radius),e.insert("rect",":first-child").attr("x",l).attr("y",t().state.titleShift-t().state.textHeight-t().state.padding).attr("width",d).attr("height",m.height+3+2*t().state.textHeight).attr("rx",t().state.radius),e},_=e=>(e.append("circle").attr("class","end-state-outer").attr("r",t().state.sizeUnit+t().state.miniPadding).attr("cx",t().state.padding+t().state.sizeUnit+t().state.miniPadding).attr("cy",t().state.padding+t().state.sizeUnit+t().state.miniPadding),e.append("circle").attr("class","end-state-inner").attr("r",t().state.sizeUnit).attr("cx",t().state.padding+t().state.sizeUnit+2).attr("cy",t().state.padding+t().state.sizeUnit+2)),q=(e,i)=>{let o=t().state.forkWidth,c=t().state.forkHeight;if(i.parentId){let s=o;o=c,c=s}return e.append("rect").style("stroke","black").style("fill","black").attr("width",o).attr("height",c).attr("x",t().state.padding).attr("y",t().state.padding)},Z=(e,i,o,c)=>{let s=0;const g=c.append("text");g.style("text-anchor","start"),g.attr("class","noteText");let p=e.replace(/\r\n/g,"<br/>");p=p.replace(/\n/g,"<br/>");const a=p.split(T.lineBreakRegex);let r=1.25*t().state.noteMargin;for(const y of a){const x=y.trim();if(x.length>0){const d=g.append("tspan");if(d.text(x),r===0){const l=d.node().getBBox();r+=l.height}s+=r,d.attr("x",i+t().state.noteMargin),d.attr("y",o+s+1.25*t().state.noteMargin)}}return{textWidth:g.node().getBBox().width,textHeight:s}},K=(e,i)=>{i.attr("class","state-note");const o=i.append("rect").attr("x",0).attr("y",t().state.padding),c=i.append("g"),{textWidth:s,textHeight:g}=Z(e,0,0,c);return o.attr("height",g+2*t().state.noteMargin),o.attr("width",s+t().state.noteMargin*2),o},L=function(e,i){const o=i.id,c={id:o,label:i.id,width:0,height:0},s=e.append("g").attr("id",o).attr("class","stateGroup");i.type==="start"&&O(s),i.type==="end"&&_(s),(i.type==="fork"||i.type==="join")&&q(s,i),i.type==="note"&&K(i.note.text,s),i.type==="divider"&&X(s),i.type==="default"&&i.descriptions.length===0&&J(s,i),i.type==="default"&&i.descriptions.length>0&&Y(s,i);const g=s.node().getBBox();return c.width=g.width+2*t().state.padding,c.height=g.height+2*t().state.padding,c};let G=0;const Q=function(e,i,o){const c=function(r){switch(r){case N.relationType.AGGREGATION:return"aggregation";case N.relationType.EXTENSION:return"extension";case N.relationType.COMPOSITION:return"composition";case N.relationType.DEPENDENCY:return"dependency"}};i.points=i.points.filter(r=>!Number.isNaN(r.y));const s=i.points,g=$().x(function(r){return r.x}).y(function(r){return r.y}).curve(v),p=e.append("path").attr("d",g(s)).attr("id","edge"+G).attr("class","transition");let a="";if(t().state.arrowMarkerAbsolute&&(a=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,a=a.replace(/\(/g,"\\("),a=a.replace(/\)/g,"\\)")),p.attr("marker-end","url("+a+"#"+c(N.relationType.DEPENDENCY)+"End)"),o.title!==void 0){const r=e.append("g").attr("class","stateLabel"),{x:y,y:x}=U.calcLabelPosition(i.points),d=T.getRows(o.title);let l=0;const m=[];let w=0,E=0;for(let u=0;u<=d.length;u++){const h=r.append("text").attr("text-anchor","middle").text(d[u]).attr("x",y).attr("y",x+l),f=h.node().getBBox();w=Math.max(w,f.width),E=Math.min(E,f.x),b.info(f.x,y,x+l),l===0&&(l=h.node().getBBox().height,b.info("Title height",l,x)),m.push(h)}let k=l*d.length;if(d.length>1){const u=(d.length-1)*l*.5;m.forEach((h,f)=>h.attr("y",x+f*l-u)),k=l*d.length}const n=r.node().getBBox();r.insert("rect",":first-child").attr("class","box").attr("x",y-w/2-t().state.padding/2).attr("y",x-k/2-t().state.padding/2-3.5).attr("width",w+t().state.padding).attr("height",k+t().state.padding),b.info(n)}G++};let B;const z={},V=function(){},j=function(e){e.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},D=function(e,i,o,c){B=t().state;const s=t().securityLevel;let g;s==="sandbox"&&(g=H("#i"+i));const p=s==="sandbox"?H(g.nodes()[0].contentDocument.body):H("body"),a=s==="sandbox"?g.nodes()[0].contentDocument:document;b.debug("Rendering diagram "+e);const r=p.select(`[id='${i}']`);j(r);const y=c.db.getRootDoc();A(y,r,void 0,!1,p,a,c);const x=B.padding,d=r.node().getBBox(),l=d.width+x*2,m=d.height+x*2,w=l*1.75;R(r,m,w,B.useMaxWidth),r.attr("viewBox",`${d.x-B.padding} ${d.y-B.padding} `+l+" "+m)},tt=e=>e?e.length*B.fontSizeFactor:1,A=(e,i,o,c,s,g,p)=>{const a=new C({compound:!0,multigraph:!0});let r,y=!0;for(r=0;r<e.length;r++)if(e[r].stmt==="relation"){y=!1;break}o?a.setGraph({rankdir:"LR",multigraph:!0,compound:!0,ranker:"tight-tree",ranksep:y?1:B.edgeLengthFactor,nodeSep:y?1:50,isMultiGraph:!0}):a.setGraph({rankdir:"TB",multigraph:!0,compound:!0,ranksep:y?1:B.edgeLengthFactor,nodeSep:y?1:50,ranker:"tight-tree",isMultiGraph:!0}),a.setDefaultEdgeLabel(function(){return{}}),p.db.extract(e);const x=p.db.getStates(),d=p.db.getRelations(),l=Object.keys(x);for(const n of l){const u=x[n];o&&(u.parentId=o);let h;if(u.doc){let f=i.append("g").attr("id",u.id).attr("class","stateGroup");h=A(u.doc,f,u.id,!c,s,g,p);{f=I(f,u,c);let S=f.node().getBBox();h.width=S.width,h.height=S.height+B.padding/2,z[u.id]={y:B.compositTitleSize}}}else h=L(i,u);if(u.note){const f={descriptions:[],id:u.id+"-note",note:u.note,type:"note"},S=L(i,f);u.note.position==="left of"?(a.setNode(h.id+"-note",S),a.setNode(h.id,h)):(a.setNode(h.id,h),a.setNode(h.id+"-note",S)),a.setParent(h.id,h.id+"-group"),a.setParent(h.id+"-note",h.id+"-group")}else a.setNode(h.id,h)}b.debug("Count=",a.nodeCount(),a);let m=0;d.forEach(function(n){m++,b.debug("Setting edge",n),a.setEdge(n.id1,n.id2,{relation:n,width:tt(n.title),height:B.labelHeight*T.getRows(n.title).length,labelpos:"c"},"id"+m)}),F(a),b.debug("Graph after layout",a.nodes());const w=i.node();a.nodes().forEach(function(n){n!==void 0&&a.node(n)!==void 0?(b.warn("Node "+n+": "+JSON.stringify(a.node(n))),s.select("#"+w.id+" #"+n).attr("transform","translate("+(a.node(n).x-a.node(n).width/2)+","+(a.node(n).y+(z[n]?z[n].y:0)-a.node(n).height/2)+" )"),s.select("#"+w.id+" #"+n).attr("data-x-shift",a.node(n).x-a.node(n).width/2),g.querySelectorAll("#"+w.id+" #"+n+" .divider").forEach(h=>{const f=h.parentElement;let S=0,M=0;f&&(f.parentElement&&(S=f.parentElement.getBBox().width),M=parseInt(f.getAttribute("data-x-shift"),10),Number.isNaN(M)&&(M=0)),h.setAttribute("x1",0-M+8),h.setAttribute("x2",S-M-8)})):b.debug("No Node "+n+": "+JSON.stringify(a.node(n)))});let E=w.getBBox();a.edges().forEach(function(n){n!==void 0&&a.edge(n)!==void 0&&(b.debug("Edge "+n.v+" -> "+n.w+": "+JSON.stringify(a.edge(n))),Q(i,a.edge(n),a.edge(n).relation))}),E=w.getBBox();const k={id:o||"root",label:o||"root",width:0,height:0};return k.width=E.width+2*B.padding,k.height=E.height+2*B.padding,b.debug("Doc rendered",k,a),k},et={setConf:V,draw:D},xt={parser:W,db:N,renderer:et,styles:P,init:e=>{e.state||(e.state={}),e.state.arrowMarkerAbsolute=e.arrowMarkerAbsolute,N.clear()}};export{xt as diagram};
|
|
1
|
+
import{s as P,d as N,p as W}from"./styles-6aaf32cf-CuwtY8aD.js";import{g as t,d as H,l as b,e as R,k as T,t as v,u as U}from"./index-D35EPyAQ.js";import{G as C}from"./graph-Cz6eZWdE.js";import{l as F}from"./layout-xjQVmyNt.js";import{l as $}from"./line-CnJU8oQA.js";import"./index-CvvgEQLL.js";import"./isEmpty-BQn8FtDD.js";import"./has-xmSj69Ai.js";import"./hasIn-BEuiXUL_.js";import"./pick-Bz9u-Vgl.js";import"./array-BKyUJesY.js";import"./path-CbwjOpE9.js";const O=e=>e.append("circle").attr("class","start-state").attr("r",t().state.sizeUnit).attr("cx",t().state.padding+t().state.sizeUnit).attr("cy",t().state.padding+t().state.sizeUnit),X=e=>e.append("line").style("stroke","grey").style("stroke-dasharray","3").attr("x1",t().state.textHeight).attr("class","divider").attr("x2",t().state.textHeight*2).attr("y1",0).attr("y2",0),J=(e,i)=>{const o=e.append("text").attr("x",2*t().state.padding).attr("y",t().state.textHeight+2*t().state.padding).attr("font-size",t().state.fontSize).attr("class","state-title").text(i.id),c=o.node().getBBox();return e.insert("rect",":first-child").attr("x",t().state.padding).attr("y",t().state.padding).attr("width",c.width+2*t().state.padding).attr("height",c.height+2*t().state.padding).attr("rx",t().state.radius),o},Y=(e,i)=>{const o=function(l,m,w){const E=l.append("tspan").attr("x",2*t().state.padding).text(m);w||E.attr("dy",t().state.textHeight)},s=e.append("text").attr("x",2*t().state.padding).attr("y",t().state.textHeight+1.3*t().state.padding).attr("font-size",t().state.fontSize).attr("class","state-title").text(i.descriptions[0]).node().getBBox(),g=s.height,p=e.append("text").attr("x",t().state.padding).attr("y",g+t().state.padding*.4+t().state.dividerMargin+t().state.textHeight).attr("class","state-description");let a=!0,r=!0;i.descriptions.forEach(function(l){a||(o(p,l,r),r=!1),a=!1});const y=e.append("line").attr("x1",t().state.padding).attr("y1",t().state.padding+g+t().state.dividerMargin/2).attr("y2",t().state.padding+g+t().state.dividerMargin/2).attr("class","descr-divider"),x=p.node().getBBox(),d=Math.max(x.width,s.width);return y.attr("x2",d+3*t().state.padding),e.insert("rect",":first-child").attr("x",t().state.padding).attr("y",t().state.padding).attr("width",d+2*t().state.padding).attr("height",x.height+g+2*t().state.padding).attr("rx",t().state.radius),e},I=(e,i,o)=>{const c=t().state.padding,s=2*t().state.padding,g=e.node().getBBox(),p=g.width,a=g.x,r=e.append("text").attr("x",0).attr("y",t().state.titleShift).attr("font-size",t().state.fontSize).attr("class","state-title").text(i.id),x=r.node().getBBox().width+s;let d=Math.max(x,p);d===p&&(d=d+s);let l;const m=e.node().getBBox();i.doc,l=a-c,x>p&&(l=(p-d)/2+c),Math.abs(a-m.x)<c&&x>p&&(l=a-(x-p)/2);const w=1-t().state.textHeight;return e.insert("rect",":first-child").attr("x",l).attr("y",w).attr("class",o?"alt-composit":"composit").attr("width",d).attr("height",m.height+t().state.textHeight+t().state.titleShift+1).attr("rx","0"),r.attr("x",l+c),x<=p&&r.attr("x",a+(d-s)/2-x/2+c),e.insert("rect",":first-child").attr("x",l).attr("y",t().state.titleShift-t().state.textHeight-t().state.padding).attr("width",d).attr("height",t().state.textHeight*3).attr("rx",t().state.radius),e.insert("rect",":first-child").attr("x",l).attr("y",t().state.titleShift-t().state.textHeight-t().state.padding).attr("width",d).attr("height",m.height+3+2*t().state.textHeight).attr("rx",t().state.radius),e},_=e=>(e.append("circle").attr("class","end-state-outer").attr("r",t().state.sizeUnit+t().state.miniPadding).attr("cx",t().state.padding+t().state.sizeUnit+t().state.miniPadding).attr("cy",t().state.padding+t().state.sizeUnit+t().state.miniPadding),e.append("circle").attr("class","end-state-inner").attr("r",t().state.sizeUnit).attr("cx",t().state.padding+t().state.sizeUnit+2).attr("cy",t().state.padding+t().state.sizeUnit+2)),q=(e,i)=>{let o=t().state.forkWidth,c=t().state.forkHeight;if(i.parentId){let s=o;o=c,c=s}return e.append("rect").style("stroke","black").style("fill","black").attr("width",o).attr("height",c).attr("x",t().state.padding).attr("y",t().state.padding)},Z=(e,i,o,c)=>{let s=0;const g=c.append("text");g.style("text-anchor","start"),g.attr("class","noteText");let p=e.replace(/\r\n/g,"<br/>");p=p.replace(/\n/g,"<br/>");const a=p.split(T.lineBreakRegex);let r=1.25*t().state.noteMargin;for(const y of a){const x=y.trim();if(x.length>0){const d=g.append("tspan");if(d.text(x),r===0){const l=d.node().getBBox();r+=l.height}s+=r,d.attr("x",i+t().state.noteMargin),d.attr("y",o+s+1.25*t().state.noteMargin)}}return{textWidth:g.node().getBBox().width,textHeight:s}},K=(e,i)=>{i.attr("class","state-note");const o=i.append("rect").attr("x",0).attr("y",t().state.padding),c=i.append("g"),{textWidth:s,textHeight:g}=Z(e,0,0,c);return o.attr("height",g+2*t().state.noteMargin),o.attr("width",s+t().state.noteMargin*2),o},L=function(e,i){const o=i.id,c={id:o,label:i.id,width:0,height:0},s=e.append("g").attr("id",o).attr("class","stateGroup");i.type==="start"&&O(s),i.type==="end"&&_(s),(i.type==="fork"||i.type==="join")&&q(s,i),i.type==="note"&&K(i.note.text,s),i.type==="divider"&&X(s),i.type==="default"&&i.descriptions.length===0&&J(s,i),i.type==="default"&&i.descriptions.length>0&&Y(s,i);const g=s.node().getBBox();return c.width=g.width+2*t().state.padding,c.height=g.height+2*t().state.padding,c};let G=0;const Q=function(e,i,o){const c=function(r){switch(r){case N.relationType.AGGREGATION:return"aggregation";case N.relationType.EXTENSION:return"extension";case N.relationType.COMPOSITION:return"composition";case N.relationType.DEPENDENCY:return"dependency"}};i.points=i.points.filter(r=>!Number.isNaN(r.y));const s=i.points,g=$().x(function(r){return r.x}).y(function(r){return r.y}).curve(v),p=e.append("path").attr("d",g(s)).attr("id","edge"+G).attr("class","transition");let a="";if(t().state.arrowMarkerAbsolute&&(a=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,a=a.replace(/\(/g,"\\("),a=a.replace(/\)/g,"\\)")),p.attr("marker-end","url("+a+"#"+c(N.relationType.DEPENDENCY)+"End)"),o.title!==void 0){const r=e.append("g").attr("class","stateLabel"),{x:y,y:x}=U.calcLabelPosition(i.points),d=T.getRows(o.title);let l=0;const m=[];let w=0,E=0;for(let u=0;u<=d.length;u++){const h=r.append("text").attr("text-anchor","middle").text(d[u]).attr("x",y).attr("y",x+l),f=h.node().getBBox();w=Math.max(w,f.width),E=Math.min(E,f.x),b.info(f.x,y,x+l),l===0&&(l=h.node().getBBox().height,b.info("Title height",l,x)),m.push(h)}let k=l*d.length;if(d.length>1){const u=(d.length-1)*l*.5;m.forEach((h,f)=>h.attr("y",x+f*l-u)),k=l*d.length}const n=r.node().getBBox();r.insert("rect",":first-child").attr("class","box").attr("x",y-w/2-t().state.padding/2).attr("y",x-k/2-t().state.padding/2-3.5).attr("width",w+t().state.padding).attr("height",k+t().state.padding),b.info(n)}G++};let B;const z={},V=function(){},j=function(e){e.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},D=function(e,i,o,c){B=t().state;const s=t().securityLevel;let g;s==="sandbox"&&(g=H("#i"+i));const p=s==="sandbox"?H(g.nodes()[0].contentDocument.body):H("body"),a=s==="sandbox"?g.nodes()[0].contentDocument:document;b.debug("Rendering diagram "+e);const r=p.select(`[id='${i}']`);j(r);const y=c.db.getRootDoc();A(y,r,void 0,!1,p,a,c);const x=B.padding,d=r.node().getBBox(),l=d.width+x*2,m=d.height+x*2,w=l*1.75;R(r,m,w,B.useMaxWidth),r.attr("viewBox",`${d.x-B.padding} ${d.y-B.padding} `+l+" "+m)},tt=e=>e?e.length*B.fontSizeFactor:1,A=(e,i,o,c,s,g,p)=>{const a=new C({compound:!0,multigraph:!0});let r,y=!0;for(r=0;r<e.length;r++)if(e[r].stmt==="relation"){y=!1;break}o?a.setGraph({rankdir:"LR",multigraph:!0,compound:!0,ranker:"tight-tree",ranksep:y?1:B.edgeLengthFactor,nodeSep:y?1:50,isMultiGraph:!0}):a.setGraph({rankdir:"TB",multigraph:!0,compound:!0,ranksep:y?1:B.edgeLengthFactor,nodeSep:y?1:50,ranker:"tight-tree",isMultiGraph:!0}),a.setDefaultEdgeLabel(function(){return{}}),p.db.extract(e);const x=p.db.getStates(),d=p.db.getRelations(),l=Object.keys(x);for(const n of l){const u=x[n];o&&(u.parentId=o);let h;if(u.doc){let f=i.append("g").attr("id",u.id).attr("class","stateGroup");h=A(u.doc,f,u.id,!c,s,g,p);{f=I(f,u,c);let S=f.node().getBBox();h.width=S.width,h.height=S.height+B.padding/2,z[u.id]={y:B.compositTitleSize}}}else h=L(i,u);if(u.note){const f={descriptions:[],id:u.id+"-note",note:u.note,type:"note"},S=L(i,f);u.note.position==="left of"?(a.setNode(h.id+"-note",S),a.setNode(h.id,h)):(a.setNode(h.id,h),a.setNode(h.id+"-note",S)),a.setParent(h.id,h.id+"-group"),a.setParent(h.id+"-note",h.id+"-group")}else a.setNode(h.id,h)}b.debug("Count=",a.nodeCount(),a);let m=0;d.forEach(function(n){m++,b.debug("Setting edge",n),a.setEdge(n.id1,n.id2,{relation:n,width:tt(n.title),height:B.labelHeight*T.getRows(n.title).length,labelpos:"c"},"id"+m)}),F(a),b.debug("Graph after layout",a.nodes());const w=i.node();a.nodes().forEach(function(n){n!==void 0&&a.node(n)!==void 0?(b.warn("Node "+n+": "+JSON.stringify(a.node(n))),s.select("#"+w.id+" #"+n).attr("transform","translate("+(a.node(n).x-a.node(n).width/2)+","+(a.node(n).y+(z[n]?z[n].y:0)-a.node(n).height/2)+" )"),s.select("#"+w.id+" #"+n).attr("data-x-shift",a.node(n).x-a.node(n).width/2),g.querySelectorAll("#"+w.id+" #"+n+" .divider").forEach(h=>{const f=h.parentElement;let S=0,M=0;f&&(f.parentElement&&(S=f.parentElement.getBBox().width),M=parseInt(f.getAttribute("data-x-shift"),10),Number.isNaN(M)&&(M=0)),h.setAttribute("x1",0-M+8),h.setAttribute("x2",S-M-8)})):b.debug("No Node "+n+": "+JSON.stringify(a.node(n)))});let E=w.getBBox();a.edges().forEach(function(n){n!==void 0&&a.edge(n)!==void 0&&(b.debug("Edge "+n.v+" -> "+n.w+": "+JSON.stringify(a.edge(n))),Q(i,a.edge(n),a.edge(n).relation))}),E=w.getBBox();const k={id:o||"root",label:o||"root",width:0,height:0};return k.width=E.width+2*B.padding,k.height=E.height+2*B.padding,b.debug("Doc rendered",k,a),k},et={setConf:V,draw:D},xt={parser:W,db:N,renderer:et,styles:P,init:e=>{e.state||(e.state={}),e.state.arrowMarkerAbsolute=e.arrowMarkerAbsolute,N.clear()}};export{xt as diagram};
|
package/assets/{stateDiagram-v2-d93cdb3a-DtC5XSWV.js → stateDiagram-v2-d93cdb3a-CyibEwON.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as J,d as B,p as Q,D as X,a as H,b as Z,S as F,c as I}from"./styles-6aaf32cf-
|
|
1
|
+
import{s as J,d as B,p as Q,D as X,a as H,b as Z,S as F,c as I}from"./styles-6aaf32cf-DPVcUAPG.js";import{G as tt}from"./graph-B8wbK8JG.js";import{l as E,g,d as x,u as et,e as ot,k as w}from"./mermaid.core-Bse-qmGl.js";import{r as st}from"./index-3862675e-DUv0NNEX.js";import"./layout-DFY48Wfc.js";import"./index-CvvgEQLL.js";import"./clone-8iorvsVH.js";import"./edges-e0da2a9e-CxYbDWHf.js";import"./createText-2e5e7dd3-B5bm44t-.js";import"./line-CS-j1kBY.js";import"./array-B5oSNiGi.js";import"./path-CY0bYimO.js";const h="rect",C="rectWithTitle",nt="start",it="end",ct="divider",rt="roundedWithTitle",lt="note",at="noteGroup",_="statediagram",dt="state",Et=`${_}-${dt}`,U="transition",St="note",Tt="note-edge",pt=`${U} ${Tt}`,_t=`${_}-${St}`,ut="cluster",Dt=`${_}-${ut}`,bt="cluster-alt",ft=`${_}-${bt}`,V="parent",Y="note",At="state",N="----",ht=`${N}${Y}`,M=`${N}${V}`,m="fill:none",W="fill: #333",z="c",q="text",K="normal";let y={},d=0;const yt=function(t){const n=Object.keys(t);for(const e of n)t[e]},gt=function(t,n){return n.db.extract(n.db.getRootDocV2()),n.db.getClasses()};function $t(t){return t==null?"":t.classes?t.classes.join(" "):""}function R(t="",n=0,e="",i=N){const c=e!==null&&e.length>0?`${i}${e}`:"";return`${At}-${t}${c}-${n}`}const A=(t,n,e,i,c,r)=>{const o=e.id,u=$t(i[o]);if(o!=="root"){let T=h;e.start===!0&&(T=nt),e.start===!1&&(T=it),e.type!==H&&(T=e.type),y[o]||(y[o]={id:o,shape:T,description:w.sanitizeText(o,g()),classes:`${u} ${Et}`});const s=y[o];e.description&&(Array.isArray(s.description)?(s.shape=C,s.description.push(e.description)):s.description.length>0?(s.shape=C,s.description===o?s.description=[e.description]:s.description=[s.description,e.description]):(s.shape=h,s.description=e.description),s.description=w.sanitizeTextOrArray(s.description,g())),s.description.length===1&&s.shape===C&&(s.shape=h),!s.type&&e.doc&&(E.info("Setting cluster for ",o,G(e)),s.type="group",s.dir=G(e),s.shape=e.type===Z?ct:rt,s.classes=s.classes+" "+Dt+" "+(r?ft:""));const p={labelStyle:"",shape:s.shape,labelText:s.description,classes:s.classes,style:"",id:o,dir:s.dir,domId:R(o,d),type:s.type,padding:15};if(p.centerLabel=!0,e.note){const l={labelStyle:"",shape:lt,labelText:e.note.text,classes:_t,style:"",id:o+ht+"-"+d,domId:R(o,d,Y),type:s.type,padding:15},a={labelStyle:"",shape:at,labelText:e.note.text,classes:s.classes,style:"",id:o+M,domId:R(o,d,V),type:"group",padding:0};d++;const D=o+M;t.setNode(D,a),t.setNode(l.id,l),t.setNode(o,p),t.setParent(o,D),t.setParent(l.id,D);let S=o,b=l.id;e.note.position==="left of"&&(S=l.id,b=o),t.setEdge(S,b,{arrowhead:"none",arrowType:"",style:m,labelStyle:"",classes:pt,arrowheadStyle:W,labelpos:z,labelType:q,thickness:K})}else t.setNode(o,p)}n&&n.id!=="root"&&(E.trace("Setting node ",o," to be child of its parent ",n.id),t.setParent(o,n.id)),e.doc&&(E.trace("Adding nodes children "),xt(t,e,e.doc,i,c,!r))},xt=(t,n,e,i,c,r)=>{E.trace("items",e),e.forEach(o=>{switch(o.stmt){case I:A(t,n,o,i,c,r);break;case H:A(t,n,o,i,c,r);break;case F:{A(t,n,o.state1,i,c,r),A(t,n,o.state2,i,c,r);const u={id:"edge"+d,arrowhead:"normal",arrowTypeEnd:"arrow_barb",style:m,labelStyle:"",label:w.sanitizeText(o.description,g()),arrowheadStyle:W,labelpos:z,labelType:q,thickness:K,classes:U};t.setEdge(o.state1.id,o.state2.id,u,d),d++}break}})},G=(t,n=X)=>{let e=n;if(t.doc)for(let i=0;i<t.doc.length;i++){const c=t.doc[i];c.stmt==="dir"&&(e=c.value)}return e},Ct=async function(t,n,e,i){E.info("Drawing state diagram (v2)",n),y={},i.db.getDirection();const{securityLevel:c,state:r}=g(),o=r.nodeSpacing||50,u=r.rankSpacing||50;E.info(i.db.getRootDocV2()),i.db.extract(i.db.getRootDocV2()),E.info(i.db.getRootDocV2());const T=i.db.getStates(),s=new tt({multigraph:!0,compound:!0}).setGraph({rankdir:G(i.db.getRootDocV2()),nodesep:o,ranksep:u,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}});A(s,void 0,i.db.getRootDocV2(),T,i.db,!0);let p;c==="sandbox"&&(p=x("#i"+n));const l=c==="sandbox"?x(p.nodes()[0].contentDocument.body):x("body"),a=l.select(`[id="${n}"]`),D=l.select("#"+n+" g");await st(D,s,["barb"],_,n);const S=8;et.insertTitle(a,"statediagramTitleText",r.titleTopMargin,i.db.getDiagramTitle());const b=a.node().getBBox(),L=b.width+S*2,P=b.height+S*2;a.attr("class",_);const O=a.node().getBBox();ot(a,P,L,r.useMaxWidth);const k=`${O.x-S} ${O.y-S} ${L} ${P}`;E.debug(`viewBox ${k}`),a.attr("viewBox",k);const j=document.querySelectorAll('[id="'+n+'"] .edgeLabel .label');for(const $ of j){const v=$.getBBox(),f=document.createElementNS("http://www.w3.org/2000/svg",h);f.setAttribute("rx",0),f.setAttribute("ry",0),f.setAttribute("width",v.width),f.setAttribute("height",v.height),$.insertBefore(f,$.firstChild)}},Rt={setConf:yt,getClasses:gt,draw:Ct},Vt={parser:Q,db:B,renderer:Rt,styles:J,init:t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute,B.clear()}};export{Vt as diagram};
|
package/assets/{stateDiagram-v2-d93cdb3a-lOfkWHnS.js → stateDiagram-v2-d93cdb3a-D6v0mGya.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as J,d as B,p as Q,D as X,a as H,b as Z,S as F,c as I}from"./styles-6aaf32cf-
|
|
1
|
+
import{s as J,d as B,p as Q,D as X,a as H,b as Z,S as F,c as I}from"./styles-6aaf32cf-CuwtY8aD.js";import{G as tt}from"./graph-Cz6eZWdE.js";import{l as E,g,d as x,u as et,e as ot,k as w}from"./index-D35EPyAQ.js";import{r as st}from"./index-3862675e-B-TzDFUV.js";import"./layout-xjQVmyNt.js";import"./has-xmSj69Ai.js";import"./hasIn-BEuiXUL_.js";import"./index-CvvgEQLL.js";import"./isEmpty-BQn8FtDD.js";import"./clone-CcaoZaCt.js";import"./edges-e0da2a9e-D83AKoY_.js";import"./createText-2e5e7dd3-ClED10Yd.js";import"./index-CURBM_KW.js";import"./line-CnJU8oQA.js";import"./array-BKyUJesY.js";import"./path-CbwjOpE9.js";import"./pick-Bz9u-Vgl.js";const h="rect",C="rectWithTitle",nt="start",it="end",ct="divider",rt="roundedWithTitle",lt="note",at="noteGroup",_="statediagram",dt="state",Et=`${_}-${dt}`,m="transition",St="note",pt="note-edge",Tt=`${m} ${pt}`,_t=`${_}-${St}`,ut="cluster",Dt=`${_}-${ut}`,bt="cluster-alt",ft=`${_}-${bt}`,U="parent",V="note",At="state",N="----",ht=`${N}${V}`,M=`${N}${U}`,Y="fill:none",W="fill: #333",z="c",q="text",K="normal";let y={},d=0;const yt=function(t){const n=Object.keys(t);for(const e of n)t[e]},gt=function(t,n){return n.db.extract(n.db.getRootDocV2()),n.db.getClasses()};function $t(t){return t==null?"":t.classes?t.classes.join(" "):""}function R(t="",n=0,e="",i=N){const c=e!==null&&e.length>0?`${i}${e}`:"";return`${At}-${t}${c}-${n}`}const A=(t,n,e,i,c,r)=>{const o=e.id,u=$t(i[o]);if(o!=="root"){let p=h;e.start===!0&&(p=nt),e.start===!1&&(p=it),e.type!==H&&(p=e.type),y[o]||(y[o]={id:o,shape:p,description:w.sanitizeText(o,g()),classes:`${u} ${Et}`});const s=y[o];e.description&&(Array.isArray(s.description)?(s.shape=C,s.description.push(e.description)):s.description.length>0?(s.shape=C,s.description===o?s.description=[e.description]:s.description=[s.description,e.description]):(s.shape=h,s.description=e.description),s.description=w.sanitizeTextOrArray(s.description,g())),s.description.length===1&&s.shape===C&&(s.shape=h),!s.type&&e.doc&&(E.info("Setting cluster for ",o,G(e)),s.type="group",s.dir=G(e),s.shape=e.type===Z?ct:rt,s.classes=s.classes+" "+Dt+" "+(r?ft:""));const T={labelStyle:"",shape:s.shape,labelText:s.description,classes:s.classes,style:"",id:o,dir:s.dir,domId:R(o,d),type:s.type,padding:15};if(T.centerLabel=!0,e.note){const l={labelStyle:"",shape:lt,labelText:e.note.text,classes:_t,style:"",id:o+ht+"-"+d,domId:R(o,d,V),type:s.type,padding:15},a={labelStyle:"",shape:at,labelText:e.note.text,classes:s.classes,style:"",id:o+M,domId:R(o,d,U),type:"group",padding:0};d++;const D=o+M;t.setNode(D,a),t.setNode(l.id,l),t.setNode(o,T),t.setParent(o,D),t.setParent(l.id,D);let S=o,b=l.id;e.note.position==="left of"&&(S=l.id,b=o),t.setEdge(S,b,{arrowhead:"none",arrowType:"",style:Y,labelStyle:"",classes:Tt,arrowheadStyle:W,labelpos:z,labelType:q,thickness:K})}else t.setNode(o,T)}n&&n.id!=="root"&&(E.trace("Setting node ",o," to be child of its parent ",n.id),t.setParent(o,n.id)),e.doc&&(E.trace("Adding nodes children "),xt(t,e,e.doc,i,c,!r))},xt=(t,n,e,i,c,r)=>{E.trace("items",e),e.forEach(o=>{switch(o.stmt){case I:A(t,n,o,i,c,r);break;case H:A(t,n,o,i,c,r);break;case F:{A(t,n,o.state1,i,c,r),A(t,n,o.state2,i,c,r);const u={id:"edge"+d,arrowhead:"normal",arrowTypeEnd:"arrow_barb",style:Y,labelStyle:"",label:w.sanitizeText(o.description,g()),arrowheadStyle:W,labelpos:z,labelType:q,thickness:K,classes:m};t.setEdge(o.state1.id,o.state2.id,u,d),d++}break}})},G=(t,n=X)=>{let e=n;if(t.doc)for(let i=0;i<t.doc.length;i++){const c=t.doc[i];c.stmt==="dir"&&(e=c.value)}return e},Ct=async function(t,n,e,i){E.info("Drawing state diagram (v2)",n),y={},i.db.getDirection();const{securityLevel:c,state:r}=g(),o=r.nodeSpacing||50,u=r.rankSpacing||50;E.info(i.db.getRootDocV2()),i.db.extract(i.db.getRootDocV2()),E.info(i.db.getRootDocV2());const p=i.db.getStates(),s=new tt({multigraph:!0,compound:!0}).setGraph({rankdir:G(i.db.getRootDocV2()),nodesep:o,ranksep:u,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}});A(s,void 0,i.db.getRootDocV2(),p,i.db,!0);let T;c==="sandbox"&&(T=x("#i"+n));const l=c==="sandbox"?x(T.nodes()[0].contentDocument.body):x("body"),a=l.select(`[id="${n}"]`),D=l.select("#"+n+" g");await st(D,s,["barb"],_,n);const S=8;et.insertTitle(a,"statediagramTitleText",r.titleTopMargin,i.db.getDiagramTitle());const b=a.node().getBBox(),L=b.width+S*2,P=b.height+S*2;a.attr("class",_);const O=a.node().getBBox();ot(a,P,L,r.useMaxWidth);const k=`${O.x-S} ${O.y-S} ${L} ${P}`;E.debug(`viewBox ${k}`),a.attr("viewBox",k);const j=document.querySelectorAll('[id="'+n+'"] .edgeLabel .label');for(const $ of j){const v=$.getBBox(),f=document.createElementNS("http://www.w3.org/2000/svg",h);f.setAttribute("rx",0),f.setAttribute("ry",0),f.setAttribute("width",v.width),f.setAttribute("height",v.height),$.insertBefore(f,$.firstChild)}},Rt={setConf:yt,getClasses:gt,draw:Ct},qt={parser:Q,db:B,renderer:Rt,styles:J,init:t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute,B.clear()}};export{qt as diagram};
|