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.
Files changed (154) hide show
  1. package/README.md +3 -3
  2. package/assets/{ChatMessagesArea-Btxhq7Z2.js → ChatMessagesArea-BQ33OSbv.js} +4 -4
  3. package/assets/DialogTaskList-D8vkITTk.js +1 -0
  4. package/assets/KnowledgeBaseContent-iIzzEUb9.js +143 -0
  5. package/assets/{ToolboxDrawer-CFAgOmIa.js → ToolboxDrawer-BUixzCAh.js} +14 -14
  6. package/assets/{ai-analyze-CXbDwr-F.js → ai-analyze-BSLl2uAK.js} +1 -1
  7. package/assets/ai-image-generation-DvTfL5Pf.js +1 -0
  8. package/assets/ai-video-generation-mgvQmDxU.js +5 -0
  9. package/assets/{arc-BVpYfX8u.js → arc-7VZa8sld.js} +1 -1
  10. package/assets/{arc-Vb6QIvRI.js → arc-CPYfXPW2.js} +1 -1
  11. package/assets/{batch-image-generation-rvn9zCP-.js → batch-image-generation-C7g9dTtb.js} +5 -5
  12. package/assets/{blockDiagram-38ab4fdb-CbbmIvT5.js → blockDiagram-38ab4fdb-9wKjan3w.js} +1 -1
  13. package/assets/{blockDiagram-38ab4fdb-CbUExfWH.js → blockDiagram-38ab4fdb-BfYiey8T.js} +1 -1
  14. package/assets/{c4Diagram-3d4e48cf-Db1GHdmL.js → c4Diagram-3d4e48cf-Cl1CeBZ9.js} +1 -1
  15. package/assets/{c4Diagram-3d4e48cf-Dw_8bcgE.js → c4Diagram-3d4e48cf-CvDzfWGg.js} +1 -1
  16. package/assets/channel-Dq0dBTpp.js +1 -0
  17. package/assets/channel-QRfYJ0c8.js +1 -0
  18. package/assets/{classDiagram-70f12bd4-CXXAHxeU.js → classDiagram-70f12bd4-7hx7i_r9.js} +1 -1
  19. package/assets/{classDiagram-70f12bd4-_p3Dnvx6.js → classDiagram-70f12bd4-C4dqbFYb.js} +1 -1
  20. package/assets/{classDiagram-v2-f2320105-B-9myg44.js → classDiagram-v2-f2320105-BE6EhyIR.js} +1 -1
  21. package/assets/{classDiagram-v2-f2320105-ChK1LfBX.js → classDiagram-v2-f2320105-BKvCao98.js} +1 -1
  22. package/assets/{clipper-CJLNPhZM.js → clipper-DMBYubGg.js} +1 -1
  23. package/assets/clone-8iorvsVH.js +1 -0
  24. package/assets/clone-CcaoZaCt.js +1 -0
  25. package/assets/{createText-2e5e7dd3-BCbwgqBS.js → createText-2e5e7dd3-B5bm44t-.js} +1 -1
  26. package/assets/{createText-2e5e7dd3-BGRSuPih.js → createText-2e5e7dd3-ClED10Yd.js} +1 -1
  27. package/assets/{edges-e0da2a9e-BoQQRKl3.js → edges-e0da2a9e-CxYbDWHf.js} +1 -1
  28. package/assets/{edges-e0da2a9e-1EAOsAGW.js → edges-e0da2a9e-D83AKoY_.js} +1 -1
  29. package/assets/{erDiagram-9861fffd-DrPXJadW.js → erDiagram-9861fffd-By6KGQIp.js} +1 -1
  30. package/assets/{erDiagram-9861fffd-DIqIVsjO.js → erDiagram-9861fffd-DklWxrea.js} +1 -1
  31. package/assets/{flowDb-956e92f1-DKdojl1Z.js → flowDb-956e92f1-B5waKznT.js} +1 -1
  32. package/assets/{flowDb-956e92f1-_yAXk9b2.js → flowDb-956e92f1-zlQFiVfE.js} +1 -1
  33. package/assets/{flowDiagram-66a62f08-Cn3BWcxJ.js → flowDiagram-66a62f08-Be1TW-l_.js} +1 -1
  34. package/assets/{flowDiagram-66a62f08-BSNSE1vH.js → flowDiagram-66a62f08-DN-7_2yD.js} +1 -1
  35. package/assets/flowDiagram-v2-96b9c2cf-Brfi4xIj.js +1 -0
  36. package/assets/flowDiagram-v2-96b9c2cf-CPIzTRuX.js +1 -0
  37. package/assets/{flowchart-elk-definition-4a651766-CkhkUOMa.js → flowchart-elk-definition-4a651766-N0AfQRnQ.js} +1 -1
  38. package/assets/{flowchart-elk-definition-4a651766-CtRYHypS.js → flowchart-elk-definition-4a651766-r-PtKbtF.js} +1 -1
  39. package/assets/{ganttDiagram-c361ad54-C-olbHti.js → ganttDiagram-c361ad54-Bht9glx_.js} +1 -1
  40. package/assets/{ganttDiagram-c361ad54-DWZxEumf.js → ganttDiagram-c361ad54-C2_MLBXD.js} +1 -1
  41. package/assets/{gitGraphDiagram-72cf32ee-DFI0WJ7k.js → gitGraphDiagram-72cf32ee-2be20W2P.js} +1 -1
  42. package/assets/{gitGraphDiagram-72cf32ee-Dz3X9B4S.js → gitGraphDiagram-72cf32ee-DbRkmH2_.js} +1 -1
  43. package/assets/{graph-BbAdRpyG.js → graph-B8wbK8JG.js} +1 -1
  44. package/assets/{graph-CG3zmXkL.js → graph-Cz6eZWdE.js} +1 -1
  45. package/assets/{grid-image-CahEQ7p7.js → grid-image-BjBUsyzw.js} +1 -1
  46. package/assets/{has-Cq7YuzG9.js → has-xmSj69Ai.js} +1 -1
  47. package/assets/{hasIn-4hPyOh4r.js → hasIn-BEuiXUL_.js} +1 -1
  48. package/assets/{index-3862675e-D_PJ0qZE.js → index-3862675e-B-TzDFUV.js} +1 -1
  49. package/assets/{index-3862675e-Cy2LJr-t.js → index-3862675e-DUv0NNEX.js} +1 -1
  50. package/assets/{index-pt9oZHeu.js → index-BFKE1SDS.js} +1 -1
  51. package/assets/{index-WyqXHNHN.js → index-BGhQ9HiC.js} +10 -10
  52. package/assets/{index-C1tgh8XV.js → index-BJPn-Z4H.js} +1 -1
  53. package/assets/{index-CqEazMaK.js → index-BJt4za3u.js} +1 -1
  54. package/assets/{index-D9rMZcAy.js → index-BYIrI0Fv.js} +52 -49
  55. package/assets/index-Bf4QGnyR.css +9 -0
  56. package/assets/{index-DHrV9sCt.js → index-Bi-3shgC.js} +1 -1
  57. package/assets/{index-BiCrE7Ci.js → index-Biha89Ph.js} +1 -1
  58. package/assets/{index-BDnSt0a8.js → index-C7Vp0sfc.js} +1 -1
  59. package/assets/{index-DtNyBFxZ.js → index-CM5A34wJ.js} +1 -1
  60. package/assets/{index-XoOCAjmC.js → index-CMqABmj9.js} +1 -1
  61. package/assets/{index-BOZ3fCzl.js → index-CURBM_KW.js} +1 -1
  62. package/assets/{index-B4IEsL3l.js → index-CZI4rQ66.js} +1 -1
  63. package/assets/{index-CYf1zrx4.js → index-Cg0P1L1n.js} +1 -1
  64. package/assets/{index-B9uNbnfa.js → index-Cg4DzaGJ.js} +1 -1
  65. package/assets/{index-BZIcMnMw.js → index-Cr7eFaRi.js} +1 -1
  66. package/assets/{index-7WzIC7_D.js → index-CvvgEQLL.js} +557 -519
  67. package/assets/index-Cz1tSwF3.css +1 -0
  68. package/assets/{index-Cx19IgV-.js → index-D35EPyAQ.js} +5 -5
  69. package/assets/{index-Dv8yvI8G.js → index-D55hpwi0.js} +1 -1
  70. package/assets/{index-CciPE8zM.js → index-D8hBvwzc.js} +1 -1
  71. package/assets/{index-BkRTZMZM.js → index-DCPnuU9X.js} +1 -1
  72. package/assets/{index-Bad6y32x.js → index-DFKy--AY.js} +1 -1
  73. package/assets/{index-Bco0OAak.js → index-DGrNJ_p2.js} +1 -1
  74. package/assets/{index-DUgUd4bR.js → index-DZUnWUAx.js} +1 -1
  75. package/assets/{index-BU3nDlFy.js → index-DergpCoU.js} +1 -1
  76. package/assets/{index-DBCwQvu4.js → index-Dgpls_LJ.js} +1 -1
  77. package/assets/{index-jHCkpoWQ.js → index-Dh9OAfqP.js} +1 -1
  78. package/assets/{index-Dqi7TZna.js → index-DoC8-4hw.js} +2 -2
  79. package/assets/{index-BQS_8NU3.js → index-DoNZZrMr.js} +1 -1
  80. package/assets/{index-Bfs6Q-lQ.js → index-Dwd3fQIs.js} +1 -1
  81. package/assets/{index-BE7n-LiY.js → index-H9okbyq7.js} +1 -1
  82. package/assets/{index-BOHFUhjZ.js → index-iNzLrLfW.js} +1 -1
  83. package/assets/index-pQpy2-r1.js +1 -0
  84. package/assets/{index-ICFaM7Tx.js → index-ukQeGfpm.js} +1 -1
  85. package/assets/{infoDiagram-f8f76790-D8T-erO4.js → infoDiagram-f8f76790-Ds4mXkkB.js} +1 -1
  86. package/assets/{infoDiagram-f8f76790-C0TYyx3w.js → infoDiagram-f8f76790-Xs3wpNj_.js} +1 -1
  87. package/assets/{inspiration-board-CiL8hKbX.js → inspiration-board-aPQmVaUX.js} +1 -1
  88. package/assets/{isEmpty-BoFRUVaJ.js → isEmpty-BQn8FtDD.js} +1 -1
  89. package/assets/{journeyDiagram-49397b02-CkmFUv6i.js → journeyDiagram-49397b02-CMj7sdKi.js} +1 -1
  90. package/assets/{journeyDiagram-49397b02-BHw2LUDu.js → journeyDiagram-49397b02-DAcDgbqb.js} +1 -1
  91. package/assets/{layers-CaY2-pH6.js → layers-D6Y5pCwe.js} +1 -1
  92. package/assets/{layout-CSua1dGC.js → layout-DFY48Wfc.js} +1 -1
  93. package/assets/{layout-D_agYVJ_.js → layout-xjQVmyNt.js} +1 -1
  94. package/assets/{line-CN9rNlXr.js → line-CS-j1kBY.js} +1 -1
  95. package/assets/{line-CxGDlzoc.js → line-CnJU8oQA.js} +1 -1
  96. package/assets/{linear-DKP7SWoM.js → linear-8yUIDV7f.js} +1 -1
  97. package/assets/{linear-CvStv2Ny.js → linear-BNtDceQW.js} +1 -1
  98. package/assets/{mermaid.core-DawxQi4y.js → mermaid.core-Bse-qmGl.js} +5 -5
  99. package/assets/{mindmap-definition-fc14e90a-BWrsnm3I.js → mindmap-definition-fc14e90a-B5pHBBH0.js} +1 -1
  100. package/assets/{mindmap-definition-fc14e90a-Dmo2lz3K.js → mindmap-definition-fc14e90a-BZEj0_V2.js} +1 -1
  101. package/assets/{photo-wall-splitter-B_WR4Rl2.js → photo-wall-splitter-DNhSfZ1J.js} +1 -1
  102. package/assets/pick-Bz9u-Vgl.js +1 -0
  103. package/assets/{pieDiagram-8a3498a8-DhrponMk.js → pieDiagram-8a3498a8-BX6EY38S.js} +1 -1
  104. package/assets/{pieDiagram-8a3498a8-CmbWJAb7.js → pieDiagram-8a3498a8-C2SKAWPu.js} +1 -1
  105. package/assets/{quadrantDiagram-120e2f19-CgIF-y-_.js → quadrantDiagram-120e2f19-C_pOTOg2.js} +1 -1
  106. package/assets/{quadrantDiagram-120e2f19-DOKwrvFF.js → quadrantDiagram-120e2f19-_4F-o39n.js} +1 -1
  107. package/assets/{requirementDiagram-deff3bca-BqbqHjdU.js → requirementDiagram-deff3bca-CZBh345Y.js} +1 -1
  108. package/assets/{requirementDiagram-deff3bca-CIXltTSE.js → requirementDiagram-deff3bca-DUvc5b49.js} +1 -1
  109. package/assets/{sankeyDiagram-04a897e0-DcPermhl.js → sankeyDiagram-04a897e0-DgwQWZaB.js} +1 -1
  110. package/assets/{sankeyDiagram-04a897e0-DGiABLdx.js → sankeyDiagram-04a897e0-HlGDp0fm.js} +1 -1
  111. package/assets/{sequenceDiagram-704730f1-piXYTUjh.js → sequenceDiagram-704730f1-CZleNxPQ.js} +1 -1
  112. package/assets/{sequenceDiagram-704730f1-BUXJ6XVH.js → sequenceDiagram-704730f1-HXnccUr4.js} +1 -1
  113. package/assets/{settings-dialog-A3AH7O45.css → settings-dialog-Bf8ExAlc.css} +1 -1
  114. package/assets/settings-dialog-FIIbAUlz.js +11 -0
  115. package/assets/{shard-sync-service-BCo2qKEA.js → shard-sync-service-BmLCs0-9.js} +1 -1
  116. package/assets/{stateDiagram-587899a1-Dnd2X4K4.js → stateDiagram-587899a1-BgbU_RYJ.js} +1 -1
  117. package/assets/{stateDiagram-587899a1-Cdfs3rRO.js → stateDiagram-587899a1-wcO67Z9P.js} +1 -1
  118. package/assets/{stateDiagram-v2-d93cdb3a-DtC5XSWV.js → stateDiagram-v2-d93cdb3a-CyibEwON.js} +1 -1
  119. package/assets/{stateDiagram-v2-d93cdb3a-lOfkWHnS.js → stateDiagram-v2-d93cdb3a-D6v0mGya.js} +1 -1
  120. package/assets/{styles-6aaf32cf-B_EWv7Bz.js → styles-6aaf32cf-CuwtY8aD.js} +1 -1
  121. package/assets/{styles-6aaf32cf-BTv8Dnxa.js → styles-6aaf32cf-DPVcUAPG.js} +1 -1
  122. package/assets/{styles-9a916d00-C4vTAlbK.js → styles-9a916d00-5sadXKIs.js} +1 -1
  123. package/assets/{styles-9a916d00-BNkP2BU4.js → styles-9a916d00-BlcdlroT.js} +1 -1
  124. package/assets/{styles-c10674c1-BcxLBYaC.js → styles-c10674c1-DMY3sr0M.js} +1 -1
  125. package/assets/{styles-c10674c1-Dp5J5JrP.js → styles-c10674c1-fyvfh0rz.js} +2 -2
  126. package/assets/{svgDrawCommon-08f97a94-CalbTy9V.js → svgDrawCommon-08f97a94-D99zFeK3.js} +1 -1
  127. package/assets/{svgDrawCommon-08f97a94-5_vuhhyn.js → svgDrawCommon-08f97a94-DCKNxHs0.js} +1 -1
  128. package/assets/{timeline-definition-85554ec2-DBiJ4h6g.js → timeline-definition-85554ec2-B-Hua8_V.js} +1 -1
  129. package/assets/{timeline-definition-85554ec2-ByBsrbAq.js → timeline-definition-85554ec2-BJFySUyi.js} +1 -1
  130. package/assets/{ttd-dialog-C9noZsTQ.js → ttd-dialog-D_LEovv1.js} +4 -4
  131. package/assets/{upload-DP5n1PVz.js → upload-DPuHWdr4.js} +1 -1
  132. package/assets/{video-recovery-service-DY01FcHI.js → video-recovery-service-BUo0pCsG.js} +1 -1
  133. package/assets/{xychartDiagram-e933f94c-CJ1NxG0K.js → xychartDiagram-e933f94c-Cf5Uc503.js} +1 -1
  134. package/assets/{xychartDiagram-e933f94c-CEXcS3Lw.js → xychartDiagram-e933f94c-Cu1l8Kcq.js} +1 -1
  135. package/changelog.json +42 -0
  136. package/package.json +1 -1
  137. package/precache-manifest.json +279 -279
  138. package/sw.js +4 -4
  139. package/version.json +29 -3
  140. package/assets/DialogTaskList-0I91BD1p.js +0 -1
  141. package/assets/KnowledgeBaseContent-CSEr1paK.js +0 -153
  142. package/assets/ai-image-generation-CvUX_vnh.js +0 -1
  143. package/assets/ai-video-generation-BgDcotXE.js +0 -5
  144. package/assets/channel-ChluHQU5.js +0 -1
  145. package/assets/channel-DQ0ggWsj.js +0 -1
  146. package/assets/clone-BscGHP5K.js +0 -1
  147. package/assets/clone-CTdvgy2F.js +0 -1
  148. package/assets/flowDiagram-v2-96b9c2cf-BmoA7Lrr.js +0 -1
  149. package/assets/flowDiagram-v2-96b9c2cf-Du5Aycbt.js +0 -1
  150. package/assets/index-C_Ed2LrM.js +0 -1
  151. package/assets/index-V8UiJyjb.css +0 -1
  152. package/assets/index-qP_w2VHW.css +0 -9
  153. package/assets/pick-C1hcXSqm.js +0 -1
  154. package/assets/settings-dialog-D1OnKj0y.js +0 -11
@@ -1 +0,0 @@
1
- import{cR as L,cS as D,cT as H,cU as se,cV as ae,cW as ie,cX as ne,cY as re,cZ as G,cH as W,s as M,a6 as E,cE as B,c_ as P,c$ as pe,d0 as me,d1 as oe,d2 as U,u as R,d3 as ue,t as he,r as C,bd as N,cJ as ge,d4 as fe,aQ as l,bU as ke,bV as we,cM as z}from"./index-7WzIC7_D.js";import{P as Y}from"./index-Dqi7TZna.js";import{U as be}from"./upload-DP5n1PVz.js";const ce=3,K="aitu-backup";function Q(I){return I.map(t=>t.id?t:{...t,id:`imported-${Date.now()}-${Math.random().toString(36).slice(2,9)}`})}const xe=500*1024*1024;function Z(I,t){const e=URL.createObjectURL(I),i=document.createElement("a");i.href=e,i.download=t,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(e)}class _e{constructor(t,e){this.partIndex=1,this.currentSize=0,this.downloadedParts=[],this.baseFilename=t,this.backupId=e,this.currentZip=new L,this.part1Zip=this.currentZip}addFile(t,e){const i=typeof e=="string"?e:JSON.stringify(e,null,2);this.currentZip.file(t,i),this.currentSize+=new Blob([i]).size}async addAssetBlob(t,e,i,a){const n=typeof a=="string"?a:JSON.stringify(a,null,2),u=e.size+new Blob([n]).size;this.currentSize+u>xe&&this.currentSize>0&&(await this.finalizePart(),this.startNewPart());const c=this.currentZip.folder("assets");c.file(i,n),c.file(t,e),this.currentSize+=u}async finalizePart(){if(this.partIndex===1)return;const t={signature:K,version:ce,createdAt:Date.now(),source:"app",backupId:this.backupId,partIndex:this.partIndex,totalParts:null,isFinalPart:!1,includes:{prompts:!1,projects:!1,assets:!0,knowledgeBase:!1}};this.currentZip.file("manifest.json",JSON.stringify(t,null,2));const e=await this.currentZip.generateAsync({type:"blob",compression:"DEFLATE",compressionOptions:{level:6}}),i=`${this.baseFilename}_part${this.partIndex}.zip`;this.downloadedParts.length>0&&await new Promise(a=>setTimeout(a,500)),Z(e,i),this.downloadedParts.push({filename:i,size:e.size})}startNewPart(){this.partIndex++,this.currentZip=new L,this.currentSize=0}async finalizeAll(t){if(!(this.partIndex>1)){t.backupId=this.backupId,t.partIndex=1,t.totalParts=1,t.isFinalPart=!0,this.part1Zip.file("manifest.json",JSON.stringify(t,null,2));const u=await this.part1Zip.generateAsync({type:"blob",compression:"DEFLATE",compressionOptions:{level:6}}),c=`${this.baseFilename}.zip`;return Z(u,c),{files:[{filename:c,size:u.size}],totalParts:1,stats:t.stats}}const i={...t,backupId:this.backupId,partIndex:1,totalParts:null,isFinalPart:!1};this.part1Zip.file("manifest.json",JSON.stringify(i,null,2));const a=await this.part1Zip.generateAsync({type:"blob",compression:"DEFLATE",compressionOptions:{level:6}}),n=`${this.baseFilename}_part1.zip`;if(Z(a,n),this.downloadedParts.unshift({filename:n,size:a.size}),this.currentSize>0){const u={...t,backupId:this.backupId,partIndex:this.partIndex,totalParts:this.partIndex,isFinalPart:!0};this.currentZip.file("manifest.json",JSON.stringify(u,null,2));const c=await this.currentZip.generateAsync({type:"blob",compression:"DEFLATE",compressionOptions:{level:6}}),d=`${this.baseFilename}_part${this.partIndex}.zip`;await new Promise(p=>setTimeout(p,500)),Z(c,d),this.downloadedParts.push({filename:d,size:c.size})}return{files:this.downloadedParts,totalParts:this.partIndex,stats:t.stats}}}function J(I){return{"image/jpeg":".jpg","image/jpg":".jpg","image/png":".png","image/gif":".gif","image/webp":".webp","image/svg+xml":".svg","video/mp4":".mp4","video/webm":".webm","video/quicktime":".mov"}[I]||""}function q(I){return I.replace(/[<>:"/\\|?*]/g,"_").replace(/\s+/g," ").trim()||"unnamed"}function Se(I){let t=0;for(let e=0;e<I.length;e++){const i=I.charCodeAt(e);t=(t<<5)-t+i,t=t&t}return`cache-${Math.abs(t).toString(36)}`}function X(){return`${Date.now().toString(36)}-${Math.random().toString(36).substring(2,11)}`}class je{async exportToZip(t,e){const i=Date.now();D.track("backup_export_start",{includePrompts:t.includePrompts,includeProjects:t.includeProjects,includeAssets:t.includeAssets}),e==null||e(5,"正在准备数据...");const a=new Date,n=a.toISOString().split("T")[0],u=a.toTimeString().split(" ")[0].replace(/:/g,""),c=`aitu_backup_${n}_${u}`,d=`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`,p=new _e(c,d),g=H.getCurrentBoard(),_={currentBoardId:(g==null?void 0:g.id)||null,currentBoardName:g==null?void 0:g.name,viewport:g==null?void 0:g.viewport},r={signature:K,version:ce,createdAt:Date.now(),includes:{prompts:t.includePrompts,projects:t.includeProjects,assets:t.includeAssets,knowledgeBase:t.includeKnowledgeBase},stats:{promptCount:0,videoPromptCount:0,imagePromptCount:0,folderCount:0,boardCount:0,assetCount:0,taskCount:0,kbNoteCount:0},workspaceState:_};if(t.includePrompts){e==null||e(10,"正在导出提示词...");const m=await this.collectPromptData();p.addFile("prompts.json",m),r.stats.promptCount=m.promptHistory.length,r.stats.videoPromptCount=m.videoPromptHistory.length,r.stats.imagePromptCount=m.imagePromptHistory.length}if(t.includeKnowledgeBase){e==null||e(30,"正在导出知识库...");try{const m=await se.exportAllData();p.addFile("knowledge-base.json",m),r.stats.kbNoteCount=m.notes.length}catch(m){console.error("Failed to export knowledge base:",m)}}t.includeProjects&&(e==null||e(40,"正在导出项目..."),await this.exportProjects(p,r,e)),t.includeAssets&&(e==null||e(50,"正在导出素材..."),await this.exportAssets(p,r,e)),e==null||e(85,"正在压缩文件...");const b=await p.finalizeAll(r);return e==null||e(100,"导出完成"),D.track("backup_export_success",{duration:Date.now()-i,totalParts:b.totalParts,promptCount:r.stats.promptCount+r.stats.videoPromptCount+r.stats.imagePromptCount,projectCount:r.stats.boardCount,assetCount:r.stats.assetCount,taskCount:r.stats.taskCount}),b}downloadZip(t,e){const i=new Date,a=i.toISOString().split("T")[0],n=i.toTimeString().split(" ")[0].replace(/:/g,""),u=`aitu_backup_${a}_${n}.zip`,c=URL.createObjectURL(t),d=document.createElement("a");d.href=c,d.download=e||u,document.body.appendChild(d),d.click(),document.body.removeChild(d),URL.revokeObjectURL(c)}async collectPromptData(){await ae();const t=ie();let e=ne(),i=re();const a=await G.getAllTasks({status:W.COMPLETED}),n=a.filter(r=>{var b;return r.type===M.IMAGE&&((b=r.params)==null?void 0:b.prompt)}).map(r=>({id:`task_${r.id}`,content:r.params.prompt.trim(),timestamp:r.completedAt||r.createdAt})).filter(r=>r.content.length>0),u=a.filter(r=>{var b;return r.type===M.VIDEO&&((b=r.params)==null?void 0:b.prompt)}).map(r=>({id:`task_${r.id}`,content:r.params.prompt.trim(),timestamp:r.completedAt||r.createdAt})).filter(r=>r.content.length>0),c=new Set(i.map(r=>r.content)),d=n.filter(r=>!c.has(r.content));i=[...i,...d];const p=new Set(e.map(r=>r.content)),g=u.filter(r=>!p.has(r.content));e=[...e,...g];const _=await E.get(B.PRESET_SETTINGS);return{promptHistory:t,videoPromptHistory:e,imagePromptHistory:i,presetSettings:_||{image:{pinnedPrompts:[],deletedPrompts:[]},video:{pinnedPrompts:[],deletedPrompts:[]}}}}async exportProjects(t,e,i){const[a,n]=await Promise.all([P.loadAllFolders(),P.loadAllBoards()]),u=this.buildFolderPathMap(a);e.stats.folderCount=a.length;for(let c=0;c<n.length;c++){const d=n[c],p=d.folderId?u.get(d.folderId):null,g=q(d.name),_=p?`projects/${p}/${g}.drawnix`:`projects/${g}.drawnix`,r={type:pe.drawnix,version:me.drawnix,source:"backup",elements:d.elements||[],viewport:d.viewport||{zoom:1},theme:d.theme,boardMeta:{id:d.id,name:d.name,folderId:d.folderId,order:d.order,createdAt:d.createdAt,updatedAt:d.updatedAt}};if(t.addFile(_,r),i&&n.length>0){const b=25+Math.round((c+1)/n.length*20);i(b,`正在导出画板 (${c+1}/${n.length})...`)}}e.stats.boardCount=n.length}buildFolderPathMap(t){const e=new Map,i=new Map;for(const n of t)i.set(n.id,n);const a=n=>{if(e.has(n))return e.get(n);const u=i.get(n);if(!u)return"";const c=q(u.name);if(u.parentId){const d=a(u.parentId),p=d?`${d}/${c}`:c;return e.set(n,p),p}return e.set(n,c),c};for(const n of t)a(n.id);return e}async exportAssets(t,e,i){var m;const a=new Set;let n=0;const u=oe.createInstance({name:U.STORAGE_NAME,storeName:U.STORE_NAME}),c=await u.keys(),d=c.length;for(let s=0;s<c.length;s++){try{const o=await u.getItem(c[s]);if(o){const x=await R.getCachedBlob(o.url);if(x){const f=J(o.mimeType);await t.addAssetBlob(`${o.id}${f}`,x,`${o.id}.meta.json`,o),a.add(o.url),n++}}}catch(o){console.warn(`[BackupRestore] Failed to load asset ${c[s]}:`,o)}if(i&&d>0){const o=50+Math.round((s+1)/d*15);i(o,`正在导出本地素材 (${s+1}/${d})...`)}}const g=(await R.getAllCacheMetadata()).filter(s=>!a.has(s.url)),_=g.length;for(let s=0;s<g.length;s++){const o=g[s];try{const x=((m=o.metadata)==null?void 0:m.taskId)||Se(o.url),f={id:x,url:o.url,type:o.type==="video"?"VIDEO":"IMAGE",mimeType:o.mimeType,size:o.size,source:"AI_GENERATED",createdAt:o.cachedAt,updatedAt:o.lastUsed,metadata:o.metadata},h=await R.getCachedBlob(o.url);if(h){const w=J(o.mimeType);await t.addAssetBlob(`${x}${w}`,h,`${x}.meta.json`,f),a.add(o.url),n++}}catch(x){console.warn(`[BackupRestore] Failed to export cached media ${o.url}:`,x)}if(i&&_>0){const x=65+Math.round((s+1)/_*10);i(x,`正在导出缓存媒体 (${s+1}/${_})...`)}}e.stats.assetCount=n,i==null||i(75,"正在导出任务数据...");const b=(await G.getAllTasks()).filter(s=>{var o;return s.status===W.COMPLETED&&(s.type===M.IMAGE||s.type===M.VIDEO)&&((o=s.result)==null?void 0:o.url)});b.length>0&&(t.addFile("tasks.json",b),e.stats.taskCount=b.length)}}const ee=new je;class ye{async importFromZip(t,e){const i=Date.now();D.track("backup_import_start",{fileSize:t.size,fileName:t.name});const a={success:!1,prompts:{imported:0,skipped:0},projects:{folders:0,boards:0,merged:0,skipped:0},assets:{imported:0,skipped:0},tasks:{imported:0,skipped:0},knowledgeBase:{directories:0,notes:0,tags:0,skipped:0},errors:[]};try{e==null||e(5,"正在读取文件...");const n=await L.loadAsync(t);e==null||e(10,"正在验证文件格式...");const u=n.file("manifest.json");if(!u)throw new Error("无效的备份文件:未找到 manifest.json");const c=await u.async("string"),d=JSON.parse(c);if(d.signature!==K)throw new Error("无效的备份文件:签名不匹配");if(d.includes.prompts){e==null||e(20,"正在导入提示词...");const p=n.file("prompts.json");if(p){const g=await p.async("string"),_=JSON.parse(g);a.prompts=await this.importPromptData(_)}}if(d.includes.knowledgeBase){e==null||e(30,"正在导入知识库...");const p=await this.importKnowledgeBase(n);a.knowledgeBase=p,p.errors&&p.errors.length>0&&a.errors.push(...p.errors)}d.includes.projects&&(e==null||e(40,"正在导入项目..."),a.projects=await this.importProjects(n,e)),d.includes.assets&&(e==null||e(60,"正在导入素材..."),a.assets=await this.importAssets(n,e),e==null||e(85,"正在导入任务数据..."),a.tasks=await this.importTasks(n)),(a.projects.folders>0||a.projects.boards>0)&&await H.reload(),d.workspaceState&&(a.workspaceState=d.workspaceState),a.success=a.errors.length===0,e==null||e(100,"导入完成"),D.track("backup_import_success",{duration:Date.now()-i,promptCount:a.prompts.imported,projectCount:a.projects.boards,assetCount:a.assets.imported,taskCount:a.tasks.imported,kbNoteCount:a.knowledgeBase.notes,skippedCount:a.prompts.skipped+a.projects.skipped+a.assets.skipped+a.tasks.skipped+a.knowledgeBase.skipped})}catch(n){const u=n instanceof Error?n.message:String(n);a.errors.push(u),D.track("backup_import_failed",{duration:Date.now()-i,error:u})}return a}async importKnowledgeBase(t){const e=t.file("knowledge-base.json");if(!e)return{directories:0,notes:0,tags:0,skipped:0,errors:[]};try{const i=await e.async("string"),a=JSON.parse(i),n=await se.importAllData(a);return{directories:n.dirCount,notes:n.noteCount,tags:n.tagCount,skipped:0,errors:[]}}catch(i){return console.error("Failed to import knowledge base:",i),{directories:0,notes:0,tags:0,skipped:0,errors:[`Knowledge base import failed: ${i instanceof Error?i.message:String(i)}`]}}}async importPromptData(t){let e=0,i=0;const a=t.promptHistory||[],n=t.videoPromptHistory||[],u=t.imagePromptHistory||[];await ae();const c=ie(),d=ne(),p=re(),g=new Set(c.map(w=>w.id)),_=new Set(c.map(w=>w.content)),r=a.filter(w=>g.has(w.id)||_.has(w.content)?(i++,!1):(e++,!0)),b=new Set(d.map(w=>w.id)),m=new Set(d.map(w=>w.content)),s=n.filter(w=>b.has(w.id)||m.has(w.content)?(i++,!1):(e++,!0)),o=new Set(p.map(w=>w.id)),x=new Set(p.map(w=>w.content)),f=u.filter(w=>o.has(w.id)||x.has(w.content)?(i++,!1):(e++,!0));await E.set(B.PROMPT_HISTORY,[...c,...r]),await E.set(B.VIDEO_PROMPT_HISTORY,[...d,...s]),await E.set(B.IMAGE_PROMPT_HISTORY,[...p,...f]);const h=await E.get(B.PRESET_SETTINGS);if(h&&t.presetSettings){const w={image:{pinnedPrompts:[...new Set([...h.image.pinnedPrompts,...t.presetSettings.image.pinnedPrompts])],deletedPrompts:[...new Set([...h.image.deletedPrompts,...t.presetSettings.image.deletedPrompts])]},video:{pinnedPrompts:[...new Set([...h.video.pinnedPrompts,...t.presetSettings.video.pinnedPrompts])],deletedPrompts:[...new Set([...h.video.deletedPrompts,...t.presetSettings.video.deletedPrompts])]}};await E.set(B.PRESET_SETTINGS,w)}else t.presetSettings&&await E.set(B.PRESET_SETTINGS,t.presetSettings);return await ue(),{imported:e,skipped:i}}async importProjects(t,e){let i=0,a=0,n=0,u=0;const c=await P.loadAllFolders(),d=await P.loadAllBoards(),p=new Set(d.map(m=>m.id)),g=Object.keys(t.files).filter(m=>m.startsWith("projects/")&&m.endsWith(".drawnix")&&!m.includes("/_"));if(g.length===0)return{folders:0,boards:0,merged:0,skipped:0};const _=new Set,r=new Map;for(const m of g){const o=m.replace(/^projects\//,"").split("/");if(o.length>1){let x="";for(let f=0;f<o.length-1;f++)x=x?`${x}/${o[f]}`:o[f],_.add(x)}}const b=Array.from(_).sort((m,s)=>{const o=m.split("/").length,x=s.split("/").length;return o-x||m.localeCompare(s)});for(let m=0;m<b.length;m++){const s=b[m],o=s.split("/"),x=o[o.length-1],f=o.length>1?o.slice(0,-1).join("/"):null,h=f&&r.get(f)||null,w=X();r.set(s,w);const S=c.find(A=>A.name===x&&A.parentId===h);if(S){r.set(s,S.id),u++;continue}const v={id:w,name:x,parentId:h,order:m,isExpanded:!0,createdAt:Date.now(),updatedAt:Date.now()};await P.saveFolder(v),i++}for(let m=0;m<g.length;m++){const s=g[m];try{const o=t.file(s);if(o){const x=await o.async("string"),f=JSON.parse(x),h=f.boardMeta,S=s.replace(/^projects\//,"").split("/"),v=S.length>1?S.slice(0,-1).join("/"):null,A=v&&(r.get(v)||(h==null?void 0:h.folderId))||null,V=S[S.length-1]||"unnamed.drawnix",$=(h==null?void 0:h.name)||V.replace(".drawnix","");if(h!=null&&h.id&&p.has(h.id)){const k=d.find(j=>j.id===h.id);if(k){const j=new Set((k.elements||[]).map(y=>y.id).filter(y=>!!y)),T=(f.elements||[]).filter(y=>y.id?!j.has(y.id):!0),F={...k,elements:[...k.elements||[],...Q(T)],viewport:f.viewport||k.viewport,theme:f.theme||k.theme,updatedAt:Date.now()};await P.saveBoard(F),n++;continue}}const O={id:(h==null?void 0:h.id)||X(),name:$,folderId:A,order:(h==null?void 0:h.order)??m,elements:Q(f.elements||[]),viewport:f.viewport,theme:f.theme,createdAt:(h==null?void 0:h.createdAt)||Date.now(),updatedAt:(h==null?void 0:h.updatedAt)||Date.now()};await P.saveBoard(O),a++}}catch(o){console.warn(`[BackupRestore] Failed to import board ${s}:`,o)}if(e&&g.length>0){const o=40+Math.round((m+1)/g.length*15);e(o,`正在导入画板 (${m+1}/${g.length})...`)}}return{folders:i,boards:a,merged:n,skipped:u}}async importAssets(t,e){var g,_,r;let i=0,a=0;const n=Object.keys(t.files).filter(b=>b.startsWith("assets/")&&b.endsWith(".meta.json"));if(n.length===0)return{imported:0,skipped:0};const u=oe.createInstance({name:U.STORAGE_NAME,storeName:U.STORE_NAME}),c=await u.keys(),d=new Set(c),p=new Set(await R.getAllCachedUrls());for(let b=0;b<n.length;b++){const m=n[b],s=m.replace("assets/","").replace(".meta.json","");try{const o=t.file(m);if(!o){a++;continue}const x=await o.async("string"),f=JSON.parse(x),h=f.source==="AI_GENERATED";if(h){if(p.has(f.url)){a++;continue}}else if(d.has(s)){a++;continue}const w=[".jpg",".png",".gif",".webp",".mp4",".webm",".mov",".svg"];let S=null;for(const v of w){const A=t.file(`assets/${s}${v}`);if(A){S=await A.async("blob");break}}if(!S&&f.mimeType){const v=J(f.mimeType);if(v){const A=t.file(`assets/${s}${v}`);A&&(S=await A.async("blob"))}}if(S){const v=f.type==="VIDEO"?"video":"image";await R.cacheMediaFromBlob(f.url,S,v,{taskId:((g=f.metadata)==null?void 0:g.taskId)||s,prompt:(_=f.metadata)==null?void 0:_.prompt,model:(r=f.metadata)==null?void 0:r.model}),h||await u.setItem(s,f),i++}else console.warn(`[BackupRestore] No media file found for asset ${s}, skipping`),a++}catch(o){console.warn(`[BackupRestore] Failed to import asset ${s}:`,o),a++}if(e&&n.length>0){const o=60+Math.round((b+1)/n.length*35);e(o,`正在导入素材 (${b+1}/${n.length})...`)}}return{imported:i,skipped:a}}async importTasks(t){let e=0,i=0;const a=t.file("tasks.json");if(!a)return{imported:0,skipped:0};try{const n=await a.async("string"),u=JSON.parse(n);if(!Array.isArray(u)||u.length===0)return{imported:0,skipped:0};const c=await G.getAllTasks(),d=new Set(c.map(g=>g.id)),p=u.filter(g=>d.has(g.id)?(i++,!1):!0);p.length>0&&(await he.restoreTasks(p),e=p.length)}catch(n){console.warn("[BackupRestore] Failed to import tasks:",n)}return{imported:e,skipped:i}}}const Ie=new ye;class Ce{exportToZip(t,e){return ee.exportToZip(t,e)}importFromZip(t,e){return Ie.importFromZip(t,e)}downloadZip(t,e){ee.downloadZip(t,e)}}const te=new Ce,Ne=({open:I,onOpenChange:t,container:e,onSwitchBoard:i,onBeforeImport:a})=>{var O;const[n,u]=C.useState("backup"),[c,d]=C.useState({includePrompts:!0,includeProjects:!0,includeAssets:!0,includeKnowledgeBase:!0}),[p,g]=C.useState(!1),[_,r]=C.useState(0),[b,m]=C.useState(""),[s,o]=C.useState(null),[x,f]=C.useState(null),h=C.useRef(null),w=C.useCallback(async k=>{if(!k.currentBoardId||!i)return;const j=H.getBoard(k.currentBoardId);if(!j)return;const T=H.getCurrentBoard();if(!T||!T.elements||T.elements.length===0)await i(k.currentBoardId,k.viewport),N.success(`已切换到画板「${j.name}」`);else{const y=ge.confirm({header:"恢复画布状态",body:`备份时正在编辑画板「${k.currentBoardName||j.name}」,是否切换到该画板?`,confirmBtn:"切换",cancelBtn:"取消",onConfirm:async()=>{await i(k.currentBoardId,k.viewport),N.success(`已切换到画板「${j.name}」`),y.destroy()},onCancel:()=>{y.destroy()}})}},[i]),S=C.useCallback(async()=>{if(!p){if(x&&(await w(x),f(null)),s&&s.tasks&&s.tasks.imported>0){fe();return}t(!1),r(0),m(""),o(null)}},[p,t,s,x,w]),v=C.useCallback(async()=>{if(!c.includePrompts&&!c.includeProjects&&!c.includeAssets&&!c.includeKnowledgeBase){N.warning("请至少选择一项要备份的内容");return}g(!0),r(0),m("正在准备...");try{const k=await te.exportToZip(c,(j,T)=>{r(j),m(T)});N.success(`备份成功!共 ${k.totalParts} 个文件`),S()}catch(k){console.error("[BackupRestore] Export failed:",k),N.error("备份失败,请重试")}finally{g(!1)}},[c,S]),A=C.useCallback(()=>{var k;(k=h.current)==null||k.click()},[]),V=C.useCallback(async k=>{var T,F;const j=(T=k.target.files)==null?void 0:T[0];if(j){if(!j.name.endsWith(".zip")){N.warning("请选择 ZIP 格式的备份文件");return}g(!0),r(0),m("正在保存当前画板..."),o(null);try{a&&await a(),m("正在读取文件...");const y=await te.importFromZip(j,(le,de)=>{r(le),m(de)});o(y),(F=y.workspaceState)!=null&&F.currentBoardId&&f(y.workspaceState),y.success?N.success("导入成功!"):y.errors.length>0&&N.warning("导入完成,但有部分错误")}catch(y){console.error("[BackupRestore] Import failed:",y),N.error("导入失败,请检查文件格式")}finally{g(!1),h.current&&(h.current.value="")}}},[a]),$=C.useCallback((k,j)=>{d(T=>({...T,[k]:j}))},[]);return l.jsx(ke,{open:I,onOpenChange:S,children:l.jsxs(we,{className:"backup-restore-dialog",container:e,"data-testid":"backup-restore-dialog",children:[l.jsx("h2",{className:"backup-restore-dialog__title",children:"备份 / 恢复"}),l.jsxs("div",{className:"backup-restore-dialog__tabs",children:[l.jsx("button",{className:`backup-restore-dialog__tab ${n==="backup"?"backup-restore-dialog__tab--active":""}`,onClick:()=>u("backup"),disabled:p,children:"备份"}),l.jsx("button",{className:`backup-restore-dialog__tab ${n==="restore"?"backup-restore-dialog__tab--active":""}`,onClick:()=>u("restore"),disabled:p,children:"恢复"})]}),n==="backup"&&l.jsxs("div",{className:"backup-restore-dialog__panel",children:[l.jsx("p",{className:"backup-restore-dialog__description",children:"选择要备份的内容,将导出为 ZIP 压缩包:"}),l.jsxs("div",{className:"backup-restore-dialog__options",children:[l.jsx(z,{checked:c.includePrompts,onChange:k=>$("includePrompts",k),disabled:p,children:l.jsxs("div",{className:"backup-restore-dialog__option-content",children:[l.jsx("span",{className:"backup-restore-dialog__option-title",children:"提示词"}),l.jsx("span",{className:"backup-restore-dialog__option-desc",children:"包含图片和视频生成的历史提示词"})]})}),l.jsx(z,{checked:c.includeProjects,onChange:k=>$("includeProjects",k),disabled:p,children:l.jsxs("div",{className:"backup-restore-dialog__option-content",children:[l.jsx("span",{className:"backup-restore-dialog__option-title",children:"项目"}),l.jsx("span",{className:"backup-restore-dialog__option-desc",children:"包含所有文件夹和画板"})]})}),l.jsx(z,{checked:c.includeAssets,onChange:k=>$("includeAssets",k),disabled:p,children:l.jsxs("div",{className:"backup-restore-dialog__option-content",children:[l.jsx("span",{className:"backup-restore-dialog__option-title",children:"素材库"}),l.jsx("span",{className:"backup-restore-dialog__option-desc",children:"包含所有本地上传的图片和视频"})]})}),l.jsx(z,{checked:c.includeKnowledgeBase,onChange:k=>$("includeKnowledgeBase",k),disabled:p,children:l.jsxs("div",{className:"backup-restore-dialog__option-content",children:[l.jsx("span",{className:"backup-restore-dialog__option-title",children:"知识库"}),l.jsx("span",{className:"backup-restore-dialog__option-desc",children:"包含所有目录、笔记和标签"})]})})]}),p&&l.jsxs("div",{className:"backup-restore-dialog__progress",children:[l.jsx(Y,{percentage:_,theme:"line"}),l.jsx("span",{className:"backup-restore-dialog__progress-text",children:b})]}),l.jsxs("div",{className:"backup-restore-dialog__actions",children:[l.jsx("button",{className:"backup-restore-dialog__button backup-restore-dialog__button--cancel",onClick:S,disabled:p,children:"取消"}),l.jsx("button",{className:"backup-restore-dialog__button backup-restore-dialog__button--primary",onClick:v,disabled:p,children:p?"正在备份...":"开始备份"})]})]}),n==="restore"&&l.jsxs("div",{className:"backup-restore-dialog__panel",children:[l.jsx("p",{className:"backup-restore-dialog__description",children:"选择备份文件进行恢复,数据将增量导入(不会覆盖现有内容):"}),l.jsxs("div",{className:"backup-restore-dialog__dropzone",onClick:A,children:[l.jsx(be,{className:"backup-restore-dialog__dropzone-icon"}),l.jsx("span",{className:"backup-restore-dialog__dropzone-text",children:"点击选择备份文件 (.zip)"}),l.jsx("input",{ref:h,type:"file",accept:".zip",onChange:V,style:{display:"none"}})]}),p&&l.jsxs("div",{className:"backup-restore-dialog__progress",children:[l.jsx(Y,{percentage:_,theme:"line"}),l.jsx("span",{className:"backup-restore-dialog__progress-text",children:b})]}),s&&l.jsxs("div",{className:"backup-restore-dialog__result",children:[l.jsx("h4",{className:"backup-restore-dialog__result-title",children:s.success?"导入完成":"导入完成(有错误)"}),l.jsxs("ul",{className:"backup-restore-dialog__result-list",children:[(s.prompts.imported>0||s.prompts.skipped>0)&&l.jsxs("li",{children:["提示词:导入 ",s.prompts.imported," 条,跳过 ",s.prompts.skipped," 条"]}),(s.projects.folders>0||s.projects.boards>0||s.projects.merged>0)&&l.jsxs("li",{children:["项目:导入 ",s.projects.folders," 个文件夹,",s.projects.boards," 个画板",s.projects.merged>0&&`,合并 ${s.projects.merged} 个画板`]}),(s.assets.imported>0||s.assets.skipped>0)&&l.jsxs("li",{children:["素材:导入 ",s.assets.imported," 个,跳过 ",s.assets.skipped," 个"]}),s.knowledgeBase&&(s.knowledgeBase.notes>0||s.knowledgeBase.directories>0)&&l.jsxs("li",{children:["知识库:导入 ",s.knowledgeBase.directories," 个目录,",s.knowledgeBase.notes," 篇笔记,",s.knowledgeBase.tags," 个标签"]}),s.tasks&&(s.tasks.imported>0||s.tasks.skipped>0)&&l.jsxs("li",{children:["任务:导入 ",s.tasks.imported," 个,跳过 ",s.tasks.skipped," 个"]})]}),s.errors.length>0&&l.jsxs("div",{className:"backup-restore-dialog__result-errors",children:[l.jsx("strong",{children:"错误信息:"}),l.jsx("ul",{children:s.errors.map((k,j)=>l.jsx("li",{children:k},j))})]})]}),l.jsx("div",{className:"backup-restore-dialog__actions",children:l.jsx("button",{className:"backup-restore-dialog__button backup-restore-dialog__button--cancel",onClick:S,disabled:p,children:s?((O=s.tasks)==null?void 0:O.imported)>0?"完成并刷新":"完成":"取消"})})]})]})})};export{Ne as BackupRestoreDialog};
@@ -1 +0,0 @@
1
- .backup-restore-dialog{background:#fff;border-radius:12px;padding:24px;width:480px;max-width:90vw}.backup-restore-dialog__title{font-size:18px;font-weight:600;margin:0 0 20px;color:#1a1a1a}.backup-restore-dialog__tabs{display:flex;gap:8px;margin-bottom:20px;padding:4px;background:#f5f5f5;border-radius:8px}.backup-restore-dialog__tab{flex:1;display:flex;align-items:center;justify-content:center;gap:6px;padding:10px 16px;border:none;border-radius:6px;background:transparent;font-size:14px;font-weight:500;color:#666;cursor:pointer;transition:all .2s}.backup-restore-dialog__tab:hover:not(:disabled){background:#0000000a}.backup-restore-dialog__tab--active{background:#fff;color:var(--td-brand-color);box-shadow:0 1px 3px #0000001a}.backup-restore-dialog__tab:disabled{cursor:not-allowed;opacity:.6}.backup-restore-dialog__tab svg{font-size:16px}.backup-restore-dialog__panel{min-height:200px}.backup-restore-dialog__description{font-size:14px;color:#666;margin:0 0 16px;line-height:1.5}.backup-restore-dialog__options{display:flex;flex-direction:column;gap:12px;margin-bottom:20px}.backup-restore-dialog__options .t-checkbox{padding:12px;border:1px solid #e8e8e8;border-radius:8px;transition:all .2s}.backup-restore-dialog__options .t-checkbox:hover{border-color:var(--td-brand-color);background:var(--td-brand-color-light)}.backup-restore-dialog__options .t-checkbox__label{flex:1}.backup-restore-dialog__option-content{display:flex;flex-direction:column;gap:2px}.backup-restore-dialog__option-title{font-size:14px;font-weight:500;color:#1a1a1a}.backup-restore-dialog__option-desc{font-size:12px;color:#999}.backup-restore-dialog__dropzone{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:40px 20px;border:2px dashed #d9d9d9;border-radius:8px;background:#fafafa;cursor:pointer;transition:all .2s;margin-bottom:20px}.backup-restore-dialog__dropzone:hover{border-color:var(--td-brand-color);background:var(--td-brand-color-light)}.backup-restore-dialog__dropzone-icon{font-size:32px;color:#999}.backup-restore-dialog__dropzone-text{font-size:14px;color:#666}.backup-restore-dialog__progress{margin-bottom:20px}.backup-restore-dialog__progress .t-progress__bar{background-color:#e8e8e8}.backup-restore-dialog__progress .t-progress__inner{background:linear-gradient(135deg,var(--td-brand-color) 0%,var(--td-brand-color-6) 100%)}.backup-restore-dialog__progress-text{display:block;font-size:12px;color:#666;margin-top:8px;text-align:center;font-variant-numeric:tabular-nums}.backup-restore-dialog__result{padding:16px;background:#f6ffed;border:1px solid #b7eb8f;border-radius:8px;margin-bottom:20px}.backup-restore-dialog__result-title{font-size:14px;font-weight:500;color:#52c41a;margin:0 0 12px}.backup-restore-dialog__result-list{margin:0;padding-left:20px;font-size:13px;color:#333;line-height:1.8}.backup-restore-dialog__result-errors{margin-top:12px;padding-top:12px;border-top:1px solid #b7eb8f;font-size:12px;color:#ff4d4f}.backup-restore-dialog__result-errors ul{margin:4px 0 0;padding-left:16px}.backup-restore-dialog__actions{display:flex;justify-content:flex-end;gap:8px}.backup-restore-dialog__button{padding:8px 20px;border-radius:6px;font-size:14px;font-weight:500;cursor:pointer;border:none;transition:all .2s}.backup-restore-dialog__button:disabled{cursor:not-allowed;opacity:.6}.backup-restore-dialog__button--cancel{background:#f5f5f5;color:#333}.backup-restore-dialog__button--cancel:hover:not(:disabled){background:#e8e8e8}.backup-restore-dialog__button--primary{background:linear-gradient(135deg,var(--td-brand-color) 0%,var(--td-brand-color-6) 100%);color:#fff}.backup-restore-dialog__button--primary:hover:not(:disabled){background:linear-gradient(135deg,var(--td-brand-color-4) 0%,var(--td-brand-color) 100%)}